Hot100:合并K个升序链表(Merge k Sorted Lists)分治归并 O(N log k) ACERS 解析

副标题 / 摘要 这题本质是“k 路归并”。如果直接一条条串行并入,性能会退化;用分治按二叉树方式两两合并,能把复杂度优化到 O(N log k)。本文按 ACERS 模板把思路推导、工程映射和多语言实现一次讲透。 预计阅读时长:12~16 分钟 标签:Hot100、链表、分治、归并 SEO 关键词:Merge k Sorted Lists, 合并K个升序链表, 分治归并, LeetCode 23, O(N log k) 元描述:从串行归并到分治归并,系统讲解 LeetCode 23 的最优复杂度解法与工程实践。 目标读者 正在刷 Hot100,已经掌握 LeetCode 21 的同学 想把“双链表归并”升级为“k 路归并模板”的开发者 在服务端做多路有序流合并(日志、时间线、分片结果)的工程师 背景 / 动机 LeetCode 23 是 LeetCode 21 的自然升级版: 21:2 路归并 23:k 路归并 核心挑战不在“能不能合并”,而在“如何把复杂度控制在可接受范围”。 如果每次把结果链表继续和下一条链表做串行归并,早期节点会被反复遍历,实际性能很容易退化。 核心概念 N:所有链表节点总数 k:链表条数 串行归并:从左到右不断把当前结果和下一条链表合并 分治归并:像归并排序一样,两两合并,按层收敛 最小堆方案:维护 k 个当前头节点,每次弹出最小值并推进其所在链表 A — Algorithm(题目与算法) 题目还原 给你一个链表数组 lists,每个链表都按升序排列。 请将所有链表合并到一个升序链表中,并返回合并后的头节点。 输入输出 名称 类型 描述 lists ListNode[] k 条升序链表,元素可为空 返回 ListNode 合并后的升序链表头节点 示例 1 输入: lists = [[1,4,5],[1,3,4],[2,6]] 输出: [1,1,2,3,4,4,5,6] 示例 2 输入: lists = [] 输出: [] C — Concepts(核心思想) 思路推导:从朴素到最优 朴素法 A:拉平到数组后排序 ...

2026年2月10日 · 9 分钟 · map[name:Jeanphilo]

Hot100:合并两个有序链表(Merge Two Sorted Lists)哨兵节点归并 ACERS 解析

副标题 / 摘要 这是链表版的“归并排序合并步骤”:两条升序链表像两根排好队的队伍,比较头部把更小的节点接到结果尾部即可。本文用 ACERS 结构把哨兵节点迭代写法讲透,并给出递归对照与多语言可运行实现。 预计阅读时长:10~12 分钟 标签:Hot100、链表、归并、双指针 SEO 关键词:Hot100, Merge Two Sorted Lists, 合并两个有序链表, 归并, 哨兵节点, LeetCode 21 元描述:哨兵节点 + 双指针 O(m+n) 合并两个升序链表,附递归对比、工程迁移与多语言实现。 目标读者 正在刷 Hot100 / 准备面试的同学 写链表题经常丢头/断链、希望建立稳定模板的中级开发者 需要在 C/C++/Go/Rust 等语言里熟练做“拼接式合并”的工程师 背景 / 动机 “合并两个有序链表”看上去是简单题,但它非常像工程里的真实任务: 合并两路已排序的数据流(日志、事件、时间线) 合并两份排序好的列表(缓存片段、分片结果、分页结果) 在 O(1) 额外空间下复用节点,避免额外分配与拷贝 更重要的是:它是很多题的前置技能(如合并 k 个链表、排序链表、分治归并)。 把这个模板写熟,你后续的链表题会明显更顺。 核心概念 升序链表:沿 next 方向节点值非递减 拼接式合并(splicing):不创建新节点(除哨兵节点外),只重连 next 指针把节点接到结果链表 哨兵节点(dummy/sentinel):用一个虚拟头简化“结果链表头是谁”的特判 尾指针(tail):始终指向结果链表的最后一个节点,方便 O(1) 追加 A — Algorithm(题目与算法) 题目还原 给你两个升序链表 list1 和 list2 的头节点, 请将它们合并为一个新的 升序 链表并返回。 新链表是通过 拼接 给定的两个链表的所有节点组成的。 ...

2026年2月1日 · 9 分钟 · map[name:Jeanphilo]