Poison

23. Merge k Sorted Lists

Divide and Conquer
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
class Solution {
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
ListNode dummyHead = new ListNode();
ListNode curr = dummyHead;

while (list1 != null && list2 != null) {
if (list1.val <= list2.val) {
curr.next = list1;
list1 = list1.next;
} else {
curr.next = list2;
list2 = list2.next;
}
curr = curr.next;
}

curr.next = list1 != null ? list1 : list2;

return dummyHead.next;
}

public ListNode mergeKLists(ListNode[] lists) {
return mergeKLists(lists, 0, lists.length - 1);
}

private ListNode mergeKLists(ListNode[] lists, int left, int right) {
if (left > right) {
return null;
}

if (left == right) {
return lists[left];
}

int mid = (left + right) >>> 1;
ListNode k1 = mergeKLists(lists, left, mid);
ListNode k2 = mergeKLists(lists, mid + 1, right);
return mergeTwoLists(k1, k2);
}
}
Priority Queue
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
ListNode dummyHead = new ListNode();
ListNode curr = dummyHead;

Queue<ListNode> minHeap = new PriorityQueue<>(Comparator.comparingInt(o -> o.val));
for (ListNode head : lists) {
if (head != null) {
minHeap.offer(head);
}
}

while (!minHeap.isEmpty()) {
ListNode minNode = minHeap.poll();
curr.next = minNode;
curr = curr.next;
if (minNode.next != null) {
minHeap.offer(minNode.next);
}
}

return dummyHead.next;
}
}
Reference

23. Merge k Sorted Lists