合并K个有序链表。
Example:
Input:
[
1->4->5,
1->3->4,
2->6
]
Output: 1->1->2->3->4->4->5->6
分析:
分而治之,将多合并问题分化为二合一问题,每次合并两个list。迭代完成所有链表合并。
public Node mergeKLists(Node[] lists) {
if (lists == null || lists.length == 0) return null;
return sort(lists, 0, lists.length - 1);
}
private Node sort(Node[] lists, int lo, int hi) {
if (lo >= hi) return lists[lo];
int mid = lo + (hi - lo) / 2;
Node l1 = sort(lists, lo, mid);
Node l2 = sort(lists, mid + 1, hi);
return merge(l1, l2);
}
private Node merge(Node l1, Node l2) {
if (l1 == null) return l2;
if (l2 == null) return l1;
if (l1.val < l2.val) {
l1.next = merge(l1.next, l2);
return l1;
}
l2.next = merge(l1, l2.next);
return l2;
}
class Node {
int val;
Node next;
Node(int x) {
val = x;
}
}