解题步骤
- 构建一个最小堆,并依次把链表头插入堆中
- 弹出堆顶接到输出链表,并将堆顶所在链表的新链表头插入堆中
- 等堆元素全部弹出,合并工作就完成了
通过堆的方式实现
- 时间复杂度: O (n log k)
空间复杂度:O (k)
function mergeKLists(lists) {const res = new ListNode(0);let p = res;const h = new MinHeap();lists.forEach((item) => {if (item) h.insert(item);});while (h.size()) {const n = h.pop();p.next = n;p = p.next;if (n.next) h.insert(n.next);}return res.next;}
代码中第一个 ForEach 循环次数较少,我们忽略不计,而下面的 while 循环次数会相对多一些,循环了 n 次,所以时间复杂度 O (n) ,在 while 循环体内还有 pop 和 insert 操作,他们的时间复杂度是 log k ,k 代表链表的个数,所以整体的时间复杂度为 O (n log k)。
而空间复杂度是 O (k) ,因为我们主要使用了 MinHeap 作为中间变量。
