K路排序每次相当于从K个数中选择最小的一个,加入结果数组,然后把对应的index+1,加入新的数去比较。
对于简单的2路或者3路排序,从这2个或者3个中选择最小的一个是比较方便的,但是如果要从K个数中选择最小,而且这K个数会不断更新,那想一想,这里面最完美的数据结构就是小顶堆呀!堆顶永远是最小的元素,将其取出,其所在数组的index++,将之后所在数组的后一元素加入队列,再次进行比较!
java中用优先级队列即可
public class Solution {
class ListNodeComparator implements Comparator<ListNode>{
public int compare(ListNode o1, ListNode o2){
return o1.val - o2.val;
}
}
public ListNode mergeKLists(ArrayList<ListNode> lists) {
// Start typing your Java solution below
// DO NOT write main() function
if(lists == null||lists.size()==0) return null;
PriorityQueue<ListNode> heap = new PriorityQueue<ListNode>(11,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;
}
}