PS/LeetCode

23. Merge k Sorted Lists - Streak 10

조금씩 차근차근 2025. 9. 23. 10:12

하드 치고는 간단한 우선순위 큐 문제였다.

우선순위 큐를 이용해 매 순간 바로 뒤에 와야 할 노드를 찾아 추가해주었다.

약간 까다로운 점은 우선순위 큐에 담을 자료구조였는데, record를 하나 만들고 그 안에 Comparable을 구현해서 해결하였다.

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */

class Solution {
    PriorityQueue<Pair> pq = new PriorityQueue<>();
    public ListNode mergeKLists(ListNode[] lists) {
        int k = lists.length;
        ListNode head = new ListNode(0);
        ListNode tail = head;
        for(int i = 0; i<k; i++){
            if(lists[i] == null) continue;
            pq.add(new Pair(lists[i].val, i));
        }
        while(!pq.isEmpty()){
            Pair nowPair = pq.poll();
            tail.next = new ListNode(nowPair.first());
            tail = tail.next;
            lists[nowPair.second()] = lists[nowPair.second()].next;
            if(lists[nowPair.second()] != null){
                pq.add(new Pair(lists[nowPair.second()].val, nowPair.second()));
            }
        }
        return head.next;
    }
}



record Pair(Integer first, Integer second) implements Comparable<Pair>{
    @Override
    public int compareTo(Pair o) {
        int cmp = first.compareTo(o.first);
        if (cmp != 0) return cmp;
        return second.compareTo(o.second);
    }
}