js一刷 最佳方法
javascript
var merge = function(list1, list2) {
const dummy = new ListNode();
let cur = dummy;
while (list1 && list2) {
if (list1.val < list2.val) {
cur.next = list1;
list1 = list1.next;
} else {
cur.next = list2;
list2 = list2.next;
}
cur = cur.next;
}
cur.next = list1 ? list1 : list2;
return dummy.next;
};
var mergeKLists = function(lists) {
let len =lists.length;
if(len===0) return null;
if(len===1) return lists[0];
let left=lists.slice(0,Math.floor(len/2));
let right=lists.slice(Math.floor(len/2),len);
return merge(mergeKLists(left),mergeKLists(right));
};
核心还是归并排序
时间复杂度 = O(L log m) ,其中L是结点树,m是数组长度 (如图)

js一刷暴力
javascript
var merge=function(l1,l2){
let dummy=new ListNode(-Infinity);
let cur=dummy;
while(l1&&l2){
if(l1.val<l2.val){
cur.next=l1;
l1=l1.next;
}
else{
cur.next=l2;
l2=l2.next;
}
cur=cur.next;
}
cur.next=l1||l2;
return dummy.next;
}
var mergeKLists = function(lists) {
let head=null;
for(let i=0;i<lists.length;i++){
head=merge(head,lists[i]);
}
return head;
};
时间复杂度 = O(L*m)

js 一刷最小堆
javascript
var mergeKLists = function(lists) {
const heap=new MinPriorityQueue(node=>node.val);
for(const x of lists){
if(x) heap.enqueue(x);
}
let dummy=new ListNode();
let cur=dummy;
while(!heap.isEmpty()){
let node=heap.dequeue();
cur.next=node;
if(node.next) heap.enqueue(node.next);
cur=cur.next;
}
return dummy.next;
};
要知道 最小堆的api MinPriorityQueue(node=>node.val);
下图pq是最小堆

时间复杂度=O(L log k) ,每次入堆和出堆操作的复杂度是log k,总共要进行L次操作,L是总结点数