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 pre = dummyHead;
Queue<ListNode> queue = new PriorityQueue<>(Comparator.comparingInt(o -> o.val)); for (ListNode list : lists) { if (list != null) { queue.offer(list); } }
while (!queue.isEmpty()) { ListNode min = queue.poll(); pre.next = min; pre = pre.next; if (min.next != null) { queue.offer(min.next); } }
return dummyHead.next; } }
|
References
23. Merge k Sorted Lists
剑指 Offer II 078. 合并排序链表