链表

合并 K 个升序链表

困难#23Java时间 O(n log k)空间 O(k)

题目要做什么

合并 k 条非递减链表,返回一个非递减链表。空链表可以用空数组表示。

题目示例输入lists = [[1,4,5],[1,3,4],[2,6]]
题目示例输出[1,1,2,3,4,4,5,6]

01 为什么这样做

最小堆保存每条链当前未处理的头节点。每次取出最小节点接到结果末尾,并把它的后继入堆。

始终成立的条件

堆中至多保存每条链一个候选;堆顶是全部未处理节点中的最小值。

02 看见算法执行

动画与代码同步

修改输入,播放自己的例子

当前使用题目示例
修改输入会改变执行过程;预期输出用于核对结果。
数组 / nums步骤 1
执行状态
本次演示输出播放到最后查看

Solution.java参考解法
1class Solution {2    public ListNode mergeKLists(ListNode[] lists) {3        PriorityQueue<ListNode> heap = new PriorityQueue<>(Comparator.comparingInt(n -> n.val));4        for (ListNode head : lists) if (head != null) heap.offer(head);5        ListNode dummy = new ListNode(0), tail = dummy;6        while (!heap.isEmpty()) {7            ListNode current = heap.poll();8            tail.next = current;9            tail = current;10            if (current.next != null) heap.offer(current.next);11        }12        return dummy.next;13    }14}

键盘控制:A 后退 · D 前进

编程练习

↑↓ 选择↵ 打开Pagefind 全文检索