Merge k Sorted Lists
题意:将k个有序的list归并。
解法:
O(kn):每轮从k个list中挑出最小的元素。复杂度受k影响较大。
O(logk*n):以每个list的head.val建立最小堆,每次拿出堆顶的list的元素,将该list后一位填上来,进行筛操作。注意后一位没有元素时,注意缩减heap的规模。
import java.util.ArrayList;
public class Solution130 {
ArrayList<ListNode>heap;
intn;
public ListNode mergeKLists(ArrayList<ListNode> lists) {
int k=lists.size();
if (k==0){
return null;
}
if (k==1){
return lists.get(0);
}
heap=new ArrayList<ListNode>();
heap.add(null);
for (int i=0;i<lists.size();i++){
if (lists.get(i)!=null){
heap.add(lists.get(i));
}
}
n=heap.size()-1;
if (n==0){
return null;
}
for (int i=n/2;i>=1;i--){
heapify(i);
}
ListNode ansHead=null;
ListNode ansTail=null;
while (n>0){
ListNode temp=heap.get(1);
heap.set(1,heap.get(1).next);
if (ansHead==null){
ansHead=temp;
ansTail=temp;
}else{
ansTail.next=temp;
ansTail=temp;
}
if(heap.get(1)==null){
heap.set(1,heap.get(n));
n--;
heapify(1);
}else{
heapify(1);
}
}
return ansHead;
}
privatevoid heapify(int x) {
if(x*2>n){
return;
}
intthatNode=-1;
if(2*x+1<=n){
if(heap.get(2*x).val<heap.get(2*x+1).val){
thatNode=2*x;
}else{
thatNode=2*x+1;
}
}else{
thatNode=2*x;
}
if(heap.get(x).val>heap.get(thatNode).val){
ListNodetemp=heap.get(x);
heap.set(x,heap.get(thatNode));
heap.set(thatNode,temp);
}
heapify(thatNode);
}
}