LeetCode 138:随机链表的复制(Copy List with Random Pointer)深拷贝全解析

副标题 / 摘要 这道题的难点不是遍历链表,而是正确复制 random 指针所形成的“跨节点引用关系”。本文从朴素思路推导到哈希映射法,讲清为什么它稳定、可维护、易工程落地。 预计阅读时长:12~16 分钟 标签:链表、深拷贝、哈希表、随机指针 SEO 关键词:LeetCode 138, Copy List with Random Pointer, 随机链表复制, 深拷贝, 哈希映射 元描述:用两趟遍历 + 映射表完成随机链表深拷贝,系统讲解正确性、复杂度、工程实践与六语言实现。 A — Algorithm(题目与算法) 题目重述 给定一个长度为 n 的链表,每个节点有: val next random(可指向任意节点或 null) 要求构造该链表的深拷贝并返回新头节点。 新链表中的任何指针都不能指向原链表节点。 输入 / 输出表示 题面常用 [val, random_index] 表示每个节点: val:节点值 random_index:random 指向的节点下标;若为空则为 null 你的函数入参只有 head,输出复制链表的头节点。 示例 1 输入: [[7,null],[13,0],[11,4],[10,2],[1,0]] 输出: [[7,null],[13,0],[11,4],[10,2],[1,0]] 解释: 输出与输入的“值与引用关系”一致,但节点是全新对象。 示例 2 输入: [[1,1],[2,1]] 输出: [[1,1],[2,1]] 解释: 第一个节点 random 指向第二个节点,第二个节点 random 指向自己。 目标读者 刷 LeetCode 时对 random 指针题目不够稳的开发者 想厘清“浅拷贝 vs 深拷贝”差异的同学 希望把算法思路迁移到工程对象复制场景的工程师 背景 / 动机 普通链表只要复制 val 和 next,逻辑很直观; 但随机链表多了一个 random 指针,它可能: ...

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

LeetCode 19:删除链表的倒数第 N 个结点(双指针一趟扫描)ACERS 全解析

副标题 / 摘要 这题的核心不是“删除节点”,而是“如何在单链表里定位倒数第 N 个节点的前驱”。本文从朴素思路推导到一趟双指针解法,用 ACERS 结构讲透正确性、边界处理与工程迁移。 预计阅读时长:12~15 分钟 适用场景标签:链表基础、双指针、面试高频 SEO 关键词:LeetCode 19, Remove Nth Node From End of List, 删除链表倒数第 N 个结点, 快慢指针, 哨兵节点 元描述(Meta Description):删除链表倒数第 N 个结点的完整 ACERS 解析:从暴力到一趟双指针,含复杂度、常见坑、工程示例与 Python/C/C++/Go/Rust/JS 代码。 A — Algorithm(题目与算法) 题目重述 给你一个链表,删除链表的倒数第 n 个结点,并返回链表的头结点。 输入输出 项目 类型 含义 head ListNode 单链表头结点 n int 倒数第 n 个位置 返回值 ListNode 删除目标节点后的头结点 示例 1 输入: head = [1,2,3,4,5], n = 2 输出: [1,2,3,5] 解释:倒数第 2 个节点是 4,删除后得到 [1,2,3,5]。 ...

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

LeetCode 2:两数相加(Add Two Numbers)链表进位从朴素到最优解

副标题 / 摘要 这题本质是把「小学竖式加法」搬到链表:同位相加、处理进位、走到末尾后可能还要补一个新节点。文章将从朴素思路推到最优单遍解法,并给出工程场景与多语言实现。 预计阅读时长:12~15 分钟 标签:链表、进位、模拟、LeetCode 2 SEO 关键词:Add Two Numbers, 两数相加, 逆序链表, 进位, LeetCode 2 元描述:用哨兵节点 + 单遍遍历在 O(max(m,n)) 时间完成两条逆序数字链表求和,附常见坑、工程应用和六语言代码。 A — Algorithm(题目与算法) 题目重述 给你两个非空链表,表示两个非负整数。 数字按逆序存储,且每个节点存储一位数字。 请将两个数相加,并返回同样逆序存储的结果链表。 题目保证除数字 0 外,这两个数都不会以 0 开头。 输入输出描述 项目 含义 输入 两个链表 l1、l2,每个节点值在 0~9 输出 一个新链表,表示 l1 + l2 的结果(逆序) 示例 1 输入: l1 = [2,4,3], l2 = [5,6,4] 解释: 342 + 465 = 807 输出: [7,0,8] 示例 2 输入: l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9] 解释: 9999999 + 9999 = 10009998 输出: [8,9,9,9,0,0,0,1] 目标读者 刚开始刷链表题,想建立稳定解题模板的同学 对「进位」和「边界处理」容易写错的中级开发者 希望把算法思维迁移到工程数据流处理的工程师 背景 / 动机 看似只是 LeetCode 入门题,但它练的能力非常实用: ...

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

Hot100:排序链表(Sort List)链表归并排序 ACERS 解析

副标题 / 摘要 LeetCode 148 的核心不是“会排序”,而是“在链表结构里选对排序算法”。数组可随机访问适合快排/堆排,而单链表最匹配的是归并排序:找中点、递归分治、线性归并。 预计阅读时长:12~16 分钟 标签:Hot100、链表、归并排序、分治 SEO 关键词:Sort List, 排序链表, 链表归并排序, LeetCode 148, Hot100 元描述:用链表归并排序在 O(n log n) 内完成排序,覆盖思路推导、工程迁移、复杂度分析和多语言可运行实现。 A — Algorithm(题目与算法) 题目还原 给你链表头节点 head,请将其按升序排序并返回排序后的链表。 要求时间复杂度为 O(n log n)。 输入输出 名称 类型 描述 head ListNode 单链表头节点(可能为空) 返回 ListNode 升序排序后的头节点 示例 1 输入: 4 -> 2 -> 1 -> 3 输出: 1 -> 2 -> 3 -> 4 示例 2 输入: -1 -> 5 -> 3 -> 4 -> 0 输出: -1 -> 0 -> 3 -> 4 -> 5 目标读者 正在刷 Hot100,想把链表题模板系统化的同学 做链表题经常在“切分和拼接”环节出错的开发者 想搞清楚“为什么链表排序优先用归并”而不是快排的人 背景 / 动机 链表排序在工程里并不罕见: ...

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

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 的最优复杂度解法与工程实践。 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 = [] 输出: [] 目标读者 正在刷 Hot100,已经掌握 LeetCode 21 的同学 想把“双链表归并”升级为“k 路归并模板”的开发者 在服务端做多路有序流合并(日志、时间线、分片结果)的工程师 背景 / 动机 LeetCode 23 是 LeetCode 21 的自然升级版: ...

2026年2月10日 · 11 分钟 · 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 组链表原地反转模板:分组扫描 + 区间反转 + 安全拼接,含复杂度分析、常见坑与多语言代码。 A — Algorithm(题目与算法) 题目还原 给你链表头节点 head 和整数 k,每 k 个节点一组进行翻转,返回修改后的链表。 若剩余节点数不足 k,则保持原顺序不变。 要求只能改节点指针,不允许只改节点值。 输入输出 名称 类型 描述 head ListNode 单链表头节点 k int 每组大小(k >= 1) 返回 ListNode 分组翻转后的新头节点 示例 1 输入: head = 1 -> 2 -> 3 -> 4 -> 5, k = 2 输出: 2 -> 1 -> 4 -> 3 -> 5 示例 2 输入: head = 1 -> 2 -> 3 -> 4 -> 5, k = 3 输出: 3 -> 2 -> 1 -> 4 -> 5 目标读者 已掌握 206 / 92,希望攻克“多区间连续反转”的 Hot100 学习者 链表题常在边界和拼接步骤出错的中级开发者 需要构建稳定“链表分段处理”模板的工程师 背景 / 动机 在工程里,链式结构的批处理并不少见: ...

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

反转链表 II(Reverse Linked List II)哑节点+头插法 ACERS 解析

副标题 / 摘要 反转链表 II 的关键不在“会反转”,而在“只反转中间一段且不破坏两端连接”。本文用 ACERS 结构讲清哑节点定位、头插法重排与边界处理,给出可复用模板与多语言代码。 预计阅读时长:12~15 分钟 标签:链表、区间反转、哑节点 SEO 关键词:Reverse Linked List II, 反转链表 II, 区间反转, 哑节点, 头插法, LeetCode 92 元描述:单链表区间反转的工程化模板:哑节点 + 头插法,O(n)/O(1),附推导、常见坑与多语言实现。 目标读者 已会 206 反转链表,想进一步掌握“局部反转”的同学 经常在链表题里卡边界(left=1、right=n)的中级开发者 希望把链表指针操作做成稳定模板的工程师 背景 / 动机 Reverse Linked List(206)是“整条反转”,而 92 要求“只反转一个闭区间”。 这类“局部重排”在工程里非常常见: 任务链中的某个分段要逆序重放 事件日志只对一段做回滚重连 数据结构需要在不重建节点的前提下原地调整 难点并非复杂算法,而是: 找准区间前驱与区间首节点 反转过程中不丢失后续链路 区间反转后把前后两端重新接回去 核心概念 哑节点(dummy):统一处理 left = 1 场景,避免头节点特判地狱 前驱指针 prev:最终停在第 left-1 个节点(若 left=1 则停在 dummy) 当前指针 cur:初始为区间首节点 prev.next 头插法(head insertion):每次把 cur 后面的一个节点摘下,插到 prev 后面 A — Algorithm(题目与算法) 题目还原 给你单链表的头节点 head 和两个整数 left、right(1 <= left <= right <= n), 请你反转从位置 left 到位置 right 的链表节点,返回反转后的链表。 ...

2026年2月10日 · 7 分钟 · 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),不允许修改链表。 A — Algorithm(题目与算法) 题目还原 给定链表头节点 head,返回链表开始入环的第一个节点;如果链表无环,返回 null。 说明: 评测用 pos 表示尾节点连接到链表中的位置(0-based),pos=-1 表示无环 pos 不会作为参数传入,只用于描述测试构造 不允许修改链表 输入输出 名称 类型 描述 head ListNode 单链表头结点 返回 ListNode / null 入环点节点引用,或 null 示例 1(有环,入环点在值为 2 的节点) head = 3 -> 2 -> 0 -> -4 ^ | |_____| 输出: 节点(2) (返回节点引用/地址,不是索引或数值) 示例 2(无环) head = 1 -> 2 -> 3 输出: null 目标读者 刷 Hot100,想把“判环/入环点定位”模板一次性吃透的学习者 需要写健壮链式结构遍历(避免死循环)并能定位故障节点的工程师 面试里被问到“为什么 reset 之后会在入环点相遇”的同学 背景 / 动机 链表一旦出现环,任何“遍历到 null 为止”的代码都可能进入死循环。 工程里造成环的原因很多:指针写错、复用节点、数据结构被破坏、并发读写导致 next 异常等。 因此除了“有没有环”,更重要的是: ...

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

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

副标题 / 摘要 这是链表版的“归并排序合并步骤”:两条升序链表像两根排好队的队伍,比较头部把更小的节点接到结果尾部即可。本文用 ACERS 结构把哨兵节点迭代写法讲透,并给出递归对照与多语言可运行实现。 预计阅读时长:10~12 分钟 标签:Hot100、链表、归并、双指针 SEO 关键词:Hot100, Merge Two Sorted Lists, 合并两个有序链表, 归并, 哨兵节点, LeetCode 21 元描述:哨兵节点 + 双指针 O(m+n) 合并两个升序链表,附递归对比、工程迁移与多语言实现。 A — Algorithm(题目与算法) 题目还原 给你两个升序链表 list1 和 list2 的头节点, 请将它们合并为一个新的 升序 链表并返回。 新链表是通过 拼接 给定的两个链表的所有节点组成的。 输入输出 名称 类型 描述 list1 ListNode 升序链表 1 的头节点(可能为空) list2 ListNode 升序链表 2 的头节点(可能为空) 返回 ListNode 合并后的升序链表头节点 示例 1(自拟) list1: 1 -> 2 -> 4 list2: 1 -> 3 -> 4 输出: 1 -> 1 -> 2 -> 3 -> 4 -> 4 示例 2(自拟) list1: null list2: 0 -> 5 输出: 0 -> 5 目标读者 正在刷 Hot100 / 准备面试的同学 写链表题经常丢头/断链、希望建立稳定模板的中级开发者 需要在 C/C++/Go/Rust 等语言里熟练做“拼接式合并”的工程师 背景 / 动机 “合并两个有序链表”看上去是简单题,但它非常像工程里的真实任务: ...

2026年2月1日 · 11 分钟 · 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) 判断单链表是否有环,附替代方案对比、易错点与多语言实现。 A — Algorithm(题目与算法) 题目还原 给你一个链表的头节点 head,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 注意:pos 不作为参数进行传递,它只是用于标识链表的实际情况。 若存在环返回 true,否则返回 false。 输入输出 名称 类型 描述 head ListNode 单链表头节点(可能为空) 返回 bool 是否存在环 示例 1(自拟) head: 3 -> 2 -> 0 -> -4 ^ | |_____| 输出: true 示例 2(自拟) head: 1 -> 2 -> null 输出: false 目标读者 正在刷 Hot100 / 准备面试的同学 想把“链表双指针”沉淀成稳定模板的中级开发者 在工程里需要识别循环引用、链式结构异常的同学(C/C++/Go/Rust/JS 皆适用) 背景 / 动机 链表出现环在工程里并不罕见: 例如手写内存池的 free list、对象引用链、状态机/任务编排的 next 指针、配置链路的“下一跳”等。 ...

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