法1.分而治之
ListNode merge2(ListNode a, ListNode b) {
ListNode dummyHead, curr;
dummyHead = new ListNode(-1);
curr = dummyHead;
while (a != null && b != null) {
if (a.val <= b.val) {
curr.next = a;
a = a.next;
} else {
curr.next = b;
b = b.next;
}
curr = curr.next;
}
curr.next = (a == null) ? b : a;
return dummyHead.next;
}
ListNode mergeLists(ListNode[] listNodes, int lo,int hi) {
if(lo==hi) return null;
if(hi-lo ==1) return listNodes[lo];
if (hi-lo == 2) return merge2(listNodes[lo],listNodes[hi-1]);
int mid = (lo+hi)/2;
ListNode a = mergeLists(listNodes, lo, mid);
ListNode b = mergeLists(listNodes, mid, hi);
return merge2(a,b);
}
public ListNode mergeKLists(ListNode[] lists) {
return mergeLists(lists, 0, lists.length);
}
法2:min{Lk}=min{minLi},用一个大小为k的最小堆,先把k个链表最小元放入,每次取堆顶元素,然后加入堆顶元素所在链表的下一个元素加入堆中。
class ListNodeComparator implements Comparator<ListNode>{
public int compare(ListNode o1, ListNode o2){
return o1.val - o2.val;
}
}
public ListNode mergeKLists(ListNode[] lists) { </span>
if(lists == null||lists.length==0) return null;
PriorityQueue<ListNode> heap = new PriorityQueue<ListNode>(lists.length,new ListNodeComparator());
for(ListNode node:lists)
if(node!=null) heap.add(node);
ListNode head = null;
ListNode p = null;
ListNode q = null;
while(!heap.isEmpty()){
q = heap.poll();
if(q.next!=null) heap.add(q.next);
if(head == null) {head = q;p = q;}
else{
p.next = q;
p = p.next;
}
}
return head;
}