思路:小堆
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
if(lists.length==0){//初始化PriorityQueue如果initialCapacity<1会抛出llegalArgumentException
return null;
}
if(lists.length==1){//只有一个链表
return lists[0];
}
ListNode dummy=new ListNode(0);//新链表的虚拟头
ListNode tail=dummy;//新链表的尾
PriorityQueue<ListNode> queue=new PriorityQueue<ListNode>(lists.length,new Comparator<ListNode>() {
public int compare(ListNode o1, ListNode o2) {
return o1.val-o2.val;
}
});//定义优先队列以及比较规则
//1.将各非空链表头加入小堆
for(int i=0;i<lists.length;i++){
if(lists[i]!=null){
queue.add(lists[i]);
}
}
//2.不断取当前最小元素
ListNode node;
while(!queue.isEmpty()){
node=queue.poll();//取出堆顶元素
tail.next=node;
tail=node;
node=node.next;
if(node!=null){//key
queue.add(node);
}
}
return dummy.next;
}
}