Problem
Merge k sorted linked lists and return it as one sorted list.
Analyze and describe its complexity.
Example
Given lists:
[
2->4->null,
null,
-1->null
],
return -1->2->4->null
.
Note
分治做法中,merge()函数依然是将链表结点两两进行比较,然后在sort()函数中迭代merge两个二分后sort()的结果。PriorityQueue更为简洁。
Solution
Divide & Conquer
public class Solution {
public ListNode mergeKLists(List<ListNode> lists) {
if (lists == null || lists.size() == 0) return null;
return sort(lists, 0, lists.size()-1);
}
public ListNode sort(List<ListNode> lists, int start, int end) {
if (start < end) {
int mid = (start+end)/2;
return merge(sort(lists, start, mid), sort(lists, mid+1, end));
}
return lists.get(start);
}
public ListNode merge(ListNode n1, ListNode n2) {
ListNode head = new ListNode(0);
ListNode cur = head;
while (n1 != null && n2 != null) {
if (n1.val < n2.val) {
cur.next = n1;
n1 = n1.next;
}
else {
cur.next = n2;
n2 = n2.next;
}
cur = cur.next;
}
if (n1 != null) cur.next = n1;
else cur.next = n2;
return head.next;
}
}
Priority Queue
Edited: 2018.3
public class Solution {
public ListNode mergeKLists(List<ListNode> lists) {
if (lists == null || lists.size() == 0) return null;
ListNode dummy = new ListNode(0);
ListNode head = dummy;
PriorityQueue<ListNode> pq = new PriorityQueue<ListNode> (1, new Comparator<ListNode> (){
public int compare(ListNode n1, ListNode n2) {
return n1.val - n2.val;
}
});
for (int i = 0; i < lists.size(); i++) {
if (lists.get(i) != null) pq.offer(lists.get(i));
}
while (!pq.isEmpty()) {
head.next = pq.poll();
head = head.next;
//put the rest ListNode back to pq
if (head.next != null) pq.offer(head.next);
}
return dummy.next;
}
}
PriorityQueue Java 8
public class Solution {
public ListNode mergeKLists(ListNode[] lists) {
if (lists == null || lists.length == 0) return null;
PriorityQueue<ListNode> heap = new PriorityQueue<>((n1, n2) -> n1.val-n2.val);
for (ListNode n: lists) {
if (n != null) heap.offer(n);
}
ListNode head = new ListNode(0);
ListNode cur = head;
while (!heap.isEmpty()) {
cur.next = heap.poll();
cur = cur.next;
if (cur.next != null) heap.offer(cur.next);
}
return head.next;
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。