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:K 个一组翻转链表(Reverse Nodes in k-Group)分组反转 ACERS 解析

副标题 / 摘要 LeetCode 25 是“整链反转(206)”与“区间反转(92)”的组合升级:你要按组切分、组内反转、组间拼接,并正确处理不足 k 的尾组。本文用 ACERS 模板给出工程可复用解法。 预计阅读时长:14~18 分钟 标签:Hot100、链表、分组反转、哑节点 SEO 关键词:Reverse Nodes in k-Group, K 个一组翻转链表, 分组反转, LeetCode 25, Hot100 元描述:K 组链表原地反转模板:分组扫描 + 区间反转 + 安全拼接,含复杂度分析、常见坑与多语言代码。 目标读者 已掌握 206 / 92,希望攻克“多区间连续反转”的 Hot100 学习者 链表题常在边界和拼接步骤出错的中级开发者 需要构建稳定“链表分段处理”模板的工程师 背景 / 动机 在工程里,链式结构的批处理并不少见: 任务链按固定批次重排执行 流水线节点按批回滚或重放 数据清洗链表按批次做原地变换 这类场景的核心诉求是: 组内变换(例如反转) 组间保持顺序 尾部残组按规则保留(不足 k 不反转) LeetCode 25 正是这个能力的典型建模。 核心概念 哑节点(dummy):统一处理头节点参与反转的场景 组前驱(groupPrev):指向当前组前一个节点 组尾探针(kth):从 groupPrev 出发找第 k 个节点,判断是否够一组 组后继(groupNext):当前组反转后要接回的后半链头 组内原地反转:只反转 [groupStart, kth] 区间 A — Algorithm(题目与算法) 题目还原 给你链表头节点 head 和整数 k,每 k 个节点一组进行翻转,返回修改后的链表。 若剩余节点数不足 k,则保持原顺序不变。 要求只能改节点指针,不允许只改节点值。 ...

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

Hot100:路径和 III 前缀和 + 哈希表统计向下路径(LeetCode 437)ACERS 解析

副标题 / 摘要 “路径不必从根开始、但必须向下”使得这题无法用简单的根到叶 DP 解决。本文用 ACERS 结构讲透 树上前缀和:把任意向下路径转化为“两个前缀和的差”,用哈希表在线计数,做到 O(n) 一次 DFS 统计所有答案。 预计阅读时长:12~15 分钟 标签:Hot100、二叉树、前缀和、DFS、哈希表 SEO 关键词:Path Sum III, 路径和 III, 树上前缀和, 前缀和哈希, LeetCode 437, Hot100 元描述:前缀和 + 哈希表在线统计二叉树向下路径和等于 targetSum 的条数,包含推导、复杂度对比与多语言实现。 目标读者 刷 LeetCode、希望把“树 + 哈希”题型沉淀成模板的学习者 对“路径不从根开始”的树题容易写成 O(n^2) 的同学 做日志调用链 / 层级数据分析,需要在树结构上做区间统计的工程师 背景 / 动机 很多“树上的路径问题”都有一个坑: 你以为要从根出发、或要到叶子结束,但题目允许 从任意节点开始、到任意节点结束(但方向必须向下)。 这意味着: 你不能只维护“从根到当前”的一种状态就完事; 也不能枚举所有起点(那会退化成 O(n^2)); 更不能用滑动窗口(节点值可正可负,窗口单调性不存在)。 这题最值得掌握的点是:把“树上任意向下路径”化为“同一路径上的两个前缀和之差”。 一旦你掌握了这个模型,很多树上统计题都会变成“前缀和 + 哈希表”的熟悉配方。 核心概念 向下路径:只能从父到子(不能回头、不能跨分支) 前缀和(prefix sum):从根到当前节点路径上所有节点值的累加 差分计数:若 curSum - prevSum = target,则 prevSum = curSum - target 路径内哈希表:只统计“当前 DFS 路径上的前缀和”,回溯时必须撤销(否则会把不同分支混在一起) A — Algorithm(题目与算法) 题目还原 给定一个二叉树的根节点 root 和整数 targetSum,求二叉树里 节点值之和等于 targetSum 的向下路径 的数目。 路径不需要从根节点开始,也不需要在叶子节点结束,但路径方向必须向下(只能从父节点到子节点)。 ...

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

Hot100:环形链表 II(Linked List Cycle II)Floyd 判环 + 定位入环点 ACERS 解析

副标题 / 摘要 这题的价值在于把“判环”升级为“定位入环点”。最稳的工程化模板是 Floyd:先用快慢指针在环内相遇,再让一个指针回到头结点同步走,下一次相遇的位置就是入环点。全程不修改链表,O(n) 时间、O(1) 额外空间。 预计阅读时长:12~16 分钟 标签:Hot100、链表、快慢指针、Floyd SEO 关键词:环形链表 II, 入环点, Floyd 判圈, 快慢指针, O(1) 空间, LeetCode 142 元描述:Floyd 快慢指针判环并定位入环点:相遇后从头与相遇点同步前进,返回入环的第一个节点;O(n)/O(1),不允许修改链表。 目标读者 刷 Hot100,想把“判环/入环点定位”模板一次性吃透的学习者 需要写健壮链式结构遍历(避免死循环)并能定位故障节点的工程师 面试里被问到“为什么 reset 之后会在入环点相遇”的同学 背景 / 动机 链表一旦出现环,任何“遍历到 null 为止”的代码都可能进入死循环。 工程里造成环的原因很多:指针写错、复用节点、数据结构被破坏、并发读写导致 next 异常等。 因此除了“有没有环”,更重要的是: 环从哪里开始?(入环点) 找到入环点可以帮助你定位哪一个节点的 next 被错误地连回去了,这比单纯返回 true/false 更有诊断价值。 题目还明确要求:不允许修改链表,所以不能用“打标记/改值/断链”等手段。 核心概念 概念 含义 作用 环 沿 next 走能再次回到某节点 会导致遍历死循环 入环点 从头结点沿 next 首次进入环的那个节点 题目要求返回它 Floyd 判圈 快慢指针:slow 每次 1 步,fast 每次 2 步 O(1) 空间判环 相遇点 slow 与 fast 在环内第一次相遇的位置 用来进一步定位入环点 引用相等 判断是否为同一节点对象/地址 不能用值相等代替 A — Algorithm(题目与算法) 题目还原 给定链表头节点 head,返回链表开始入环的第一个节点;如果链表无环,返回 null。 ...

2026年2月1日 · 7 分钟 · 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]

Hot100:环形链表(Linked List Cycle)Floyd 快慢指针 ACERS 解析

副标题 / 摘要 判断链表是否有环,本质是“指针追及问题”。本文用 ACERS 结构讲透 Floyd 快慢指针判环:为什么一定能相遇、如何避免空指针、以及在工程里如何用同一思想识别循环引用/路由环路。 预计阅读时长:10~12 分钟 标签:Hot100、链表、快慢指针 SEO 关键词:Hot100, Linked List Cycle, 环形链表, 判环, Floyd, 快慢指针, LeetCode 141 元描述:Floyd 快慢指针 O(n)/O(1) 判断单链表是否有环,附替代方案对比、易错点与多语言实现。 目标读者 正在刷 Hot100 / 准备面试的同学 想把“链表双指针”沉淀成稳定模板的中级开发者 在工程里需要识别循环引用、链式结构异常的同学(C/C++/Go/Rust/JS 皆适用) 背景 / 动机 链表出现环在工程里并不罕见: 例如手写内存池的 free list、对象引用链、状态机/任务编排的 next 指针、配置链路的“下一跳”等。 一旦出现环: 遍历会进入死循环(CPU 占用飙高,日志刷爆) 资源释放/回收会卡死(例如释放链表节点时无限循环) 监控定位困难(看起来像“偶发卡死”,本质是结构性错误) 因此你需要一个不依赖额外内存、可在线检测的判环方法:Floyd 快慢指针就是这类问题的标准答案。 核心概念 环(Cycle):从某个节点开始,沿 next 指针走若干步能回到自己 pos(评测用):题目描述里的 pos 仅用于评测系统构造数据;你的函数不会收到 pos 参数 快慢指针(Floyd):慢指针每次走 1 步,快指针每次走 2 步;若存在环,二者必定在环内相遇 指针相等 vs 值相等:判环必须比较“节点身份”(引用/地址),不能只比 val(值可能重复) A — Algorithm(题目与算法) 题目还原 给你一个链表的头节点 head,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 ...

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

Hot100:回文链表(Palindrome Linked List)快慢指针 + 反转后半段 O(1) 空间 ACERS 解析

副标题 / 摘要 回文链表的核心是“对称比较”,但单链表不能从尾部往前走。最稳的工程化解法是:快慢指针找中点 -> 原地反转后半段 -> 比较 -> 再反转恢复结构,做到 O(n) 时间、O(1) 额外空间且不破坏链表。 预计阅读时长:10~14 分钟 标签:Hot100、链表、快慢指针、原地反转 SEO 关键词:回文链表, Palindrome Linked List, O(1) 空间, 快慢指针, 反转后半段, LeetCode 234 元描述:快慢指针定位中点,反转后半段与前半段逐一比较,最后恢复链表结构;O(n)/O(1) 判断单链表是否回文。 目标读者 刷 Hot100,想掌握“链表中点 + 原地反转”组合拳的学习者 面试中经常遇到“回文/对称/镜像”类题的开发者 关注空间效率、且需要保证数据结构不被破坏的工程实践者 背景 / 动机 在数组里判断回文很简单:左右指针向中间收缩即可。 但在单链表里,你只能顺着 next 单向走,无法从尾部回看,这就让“对称比较”变得不那么直接。 工程上常见的约束也与题目一致: 结构不能改(不能改值、不能打标记、不能改 next 永久化) 额外内存有限(不想把所有节点拷贝到数组里) 因此我们需要一个 线性时间、常数空间、且能恢复结构 的模板解法。 核心概念 概念 含义 作用 回文 从左到右与从右到左相同 需要做“对称比较” 快慢指针 fast 每次两步、slow 每次一步 O(n) 找到链表中点 原地反转 改指针方向把链表片段反转 把“后半段”变成可从前往后比较 结构恢复 比较完成后再反转回去并接回 满足“链表保持原结构”要求 A — Algorithm(题目与算法) 题目还原 给你一个单链表的头节点 head,请你判断该链表是否为回文链表: 如果是回文,返回 true;否则返回 false。 ...

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

Hot100:反转链表(Reverse Linked List)三指针迭代/递归 ACERS 解析

副标题 / 摘要 反转链表是“指针重连”的入门必修课:看似简单,却最容易因为边界、断链、顺序写错而翻车。本文用 ACERS 结构把三指针迭代写法讲透,并给出递归对照与多语言可运行实现。 预计阅读时长:10~12 分钟 标签:Hot100、链表、指针、迭代 SEO 关键词:Hot100, Reverse Linked List, 反转链表, 三指针, 迭代, 递归, LeetCode 206 元描述:三指针迭代 O(n)/O(1) 反转单链表,附递归对比、工程迁移与多语言实现。 目标读者 正在刷 Hot100 / 准备面试的同学 写链表题经常断链/空指针、希望建立稳定模板的中级开发者 需要在 C/C++/Rust 等语言里熟练处理指针与所有权的工程师 背景 / 动机 在真实工程里,“反转链表”不一定以 LeetCode 的形态出现,但它背后的能力非常通用: 你要在 O(1) 额外空间 下重排节点顺序(例如复用节点对象,避免额外分配) 你要理解 指针重连的顺序:先保留 next,再改 cur.next,否则就会断链 你要能写出 不会特判地狱、对 head = null 也稳的实现 把这题做成模板后,很多链表题(如反转区间、k 组反转、判断回文链表)都会变得顺手很多。 核心概念 单链表:每个节点只有一个 next 指针指向后继 断链风险:一旦把 cur.next 改掉而没保存原来的 next,就丢失后半段 三指针(prev / cur / next):用 next 暂存后继,再把 cur.next 指向 prev 循环不变量:prev 永远指向“已反转部分”的头;cur 永远指向“未处理部分”的头 A — Algorithm(题目与算法) 题目还原 给你单链表的头节点 head,请你反转链表,并返回反转后的链表。 ...

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

Hot100:相交链表(Intersection of Two Linked Lists)双指针换头 O(1) 空间 ACERS 解析

副标题 / 摘要 相交链表的关键不是比较值,而是比较“节点引用/地址”。本文用 ACERS 结构把朴素哈希解法、长度对齐解法与最常用的“双指针换头”模板讲清楚,并给出多语言可运行实现(不修改链表、无环前提)。 预计阅读时长:10~14 分钟 标签:Hot100、链表、双指针 SEO 关键词:相交链表, 双指针换头, O(1) 空间, LeetCode 160, Intersection of Two Linked Lists 元描述:双指针分别走完 A 与 B 后交换起点,保证在 m+n 步内相遇于交点或同时到达 null;O(m+n)/O(1) 且不修改链表结构。 目标读者 刷 Hot100,希望把链表双指针模板一次性吃透的学习者 经常把“节点值相等”误当作“节点相同”的初中级开发者 需要在工程里处理共享链式结构(共享后缀/共享节点)的工程师 背景 / 动机 这题看似简单,但它强迫你分清三个概念: 相交是“共享同一个节点对象/地址”,不是值相等 不能破坏结构(不能改 next、不能打标记) 还要高效:把 O(mn) 降到线性 最经典的工程化答案是“双指针换头”: 它不用额外集合、不需要先算长度,只靠指针走路就能在 m+n 步内完成同步。 核心概念 概念 含义 备注 节点相同 两个指针指向同一块内存/同一个对象 语言里通常是引用相等/指针相等 共享后缀 两条链表在某个节点开始共享接下来的所有节点 交点之后完全一致 双指针换头 指针走到链尾后跳到另一条链表的头 让两指针走过相同总路程 无环保证 题目保证整个结构无环 否则需要额外环检测处理 A — Algorithm(题目与算法) 题目还原 给你两个单链表的头节点 headA 和 headB,请你找出并返回两个单链表相交的起始节点。 如果两个链表不存在相交节点,返回 null。 ...

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

Hot100:搜索二维矩阵 II(Search a 2D Matrix II)右上角阶梯搜索 O(m+n) ACERS 解析

副标题 / 摘要 这题的关键不是二分,而是利用“行列都单调”的结构,从**右上角(或左下角)**像走楼梯一样移动:每一步都能排除一整行或一整列,从而把复杂度降到 O(m+n)。 预计阅读时长:10~13 分钟 标签:Hot100、矩阵、单调性、指针 SEO 关键词:搜索二维矩阵 II, 单调矩阵查找, 右上角搜索, O(m+n), LeetCode 240 元描述:在行列均升序的矩阵中搜索 target:从右上角阶梯式移动,每步排除一行或一列,O(m+n)/O(1) 解法与多语言实现。 目标读者 刷 Hot100,希望掌握“二维单调结构剪枝”模板的学习者 写过二分但总在二维问题里迷路的中级开发者 在工程中需要查询/裁剪/定位二维单调表格的工程师 背景 / 动机 二维表在工程里很常见:费率表、校准表、阈值表、网格配置表等。 当一个表满足“横向递增 + 纵向递增”的 二维单调(monotone matrix) 特性时,很多查询不需要 O(mn) 全扫。 这题就是经典入门:用单调性做剪枝,把搜索降成线性级别。 核心概念 概念 含义 在本题的作用 二维单调矩阵 行升序、列升序 保证“比较一次就能排除一行/列” 右上角起点 右上角元素:左边更小、下边更大 决策方向天然明确 剪枝 排除不可能包含 target 的行/列 每步减少搜索空间 O(1) 额外空间 只用 i/j 指针 适合大矩阵与性能场景 A — Algorithm(题目与算法) 题目还原 给定一个 m x n 矩阵 matrix 和一个目标值 target。矩阵满足: ...

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