news 2026/4/23 11:32:24

链表专题(六):数学与指针的完美结合——「环形链表 II」

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
链表专题(六):数学与指针的完美结合——「环形链表 II」

场景想象:你在这个链表跑道上跑步。

  • 第一步(判圈):怎么知道跑道是不是圆形的(有环)?

    • 很简单,派一个快跑者(Fast)和一个慢跑者(Slow)。如果快跑者能“套圈”追上慢跑者,说明肯定有环。

  • 第二步(找入口):如果确认有环,这个环的入口在哪里?

    • 这就难了。快慢指针相遇的地方,往往不是入口,而是环里的某个随机位置。

    • 我们需要用一个神奇的数学公式,把指针“变”回入口。

力扣 142. 环形链表 II

https://leetcode.cn/problems/linked-list-cycle-ii/

题目分析:

  • 输入:链表头head

  • 目标:如果链表有环,返回链表开始入环的第一个节点。如果没有环,返回null

  • 输出:入口节点 Node。

核心思维:快慢指针 + 数学魔法 (x = z)

这道题的解法分为两个阶段:

阶段 1:相遇(判断有环)fast每次走 2 步,slow每次走 1 步。 如果fast走到null,说明没环,结束。 如果fastslow相遇了,说明有环。此时,它们停在环里的某个点(我们记为相遇点 M)。

阶段 2:寻找入口(数学推导)假设:

  • x:从头结点到环入口的距离。

  • y:从环入口到相遇点 M 的距离。

  • z:从相遇点 M 回到环入口的距离(剩下的环长)。

推导过程(面试加分项):

  1. 慢指针走了:x + y

  2. 快指针走了:x + y + n(y + z)(它在环里多转了 n 圈才追上)

  3. 因为快指针速度是慢指针的 2 倍:2(x + y) = x + y + n(y + z)

  4. 消掉一个x + yx + y = n(y + z)

  5. 我们想求入口距离xx = n(y + z) - y

  6. 整理一下:x = (n - 1)(y + z) + z

神奇结论:n = 1时(最简单的情况),公式简化为x = z! 意思是:“头结点到入口的距离”竟然等于“相遇点到入口的距离”

操作策略:fastslow相遇时:

  1. slow留在原地(相遇点)。

  2. 派一个新的指针(或者复用fast)回到头结点head

  3. 两个指针同时每次走 1 步

  4. 因为x = z,它们一定会在环的入口相遇!

代码实现 (JavaScript)

JavaScript

/** * Definition for singly-linked list. * function ListNode(val) { * this.val = val; * this.next = null; * } */ /** * @param {ListNode} head * @return {ListNode} */ var detectCycle = function(head) { let slow = head; let fast = head; // 阶段 1:快慢指针判圈 while (fast !== null && fast.next !== null) { slow = slow.next; // 慢走1步 fast = fast.next.next; // 快走2步 // 如果相遇了,说明有环 if (slow === fast) { // 阶段 2:寻找入口 // 此时 slow 在相遇点,fast 也在相遇点 // 让 fast 回到头结点(充当那个从头走的新指针) fast = head; // 两个指针每次都走 1 步,直到再次相遇 while (slow !== fast) { slow = slow.next; fast = fast.next; } // 再次相遇的点,就是环的入口 return slow; } } // 如果退出了循环,说明遇到 null 了,没环 return null; };

深度模拟

假设链表:3 -> 2 -> 0 -> -4,其中-4指回2(形成环)。

  • 环入口是2

  • x(3到2) = 1。

  • 环长 = 3 (2 -> 0 -> -4 -> 2)。

1. 判圈:

  • Start: S(3), F(3)

  • Step 1: S(2), F(0)

  • Step 2: S(0), F(2) (F在环里超车了)

  • Step 3: S(-4), F(-4)

  • 相遇!相遇点是-4

2. 找入口:

  • 此时slow-4x是 1。z(相遇点-4 回到入口2 的距离) 也是 1。

  • 真的满足x = z

  • Resetfasthead(3)。

  • 齐步走

    • slow从 -4 走一步 -> 到 2。

    • fast从 3 走一步 -> 到 2。

  • 相遇!返回2

总结

这道题是链表进阶篇的完美句号。

  • 它不光考代码,还考逻辑推理。

  • 记住结论:“相遇后,一个从头走,一个从相遇点走,每次一步,相遇即入口。”

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 0:39:00

操作系统课程作业救星:VibeThinker解析PV操作题

VibeThinker:如何用15亿参数的小模型搞定操作系统难题? 在高校计算机课程中,有没有哪类题目最让学生头疼?如果要投票,PV操作题大概率能排进前三。它不像编程那样写出代码就能运行验证,也不像选择题那样有明…

作者头像 李华
网站建设 2026/4/23 11:14:21

【高可用系统保障】:构建企业级Docker监控平台的7个核心步骤

第一章:Docker资源监控的核心价值与挑战在现代云原生架构中,Docker作为容器化技术的基石,广泛应用于微服务部署与自动化运维。然而,随着容器数量的快速增长,如何有效监控其CPU、内存、网络和磁盘I/O等资源使用情况&…

作者头像 李华
网站建设 2026/4/18 17:34:32

百度搜索结果对比:中文环境下模型表现是否受限

百度搜索结果对比:中文环境下模型表现是否受限 在当前大语言模型(LLM)军备竞赛愈演愈烈的背景下,参数规模似乎成了衡量“智能水平”的硬通货。动辄上百亿、上千亿参数的模型不断刷新榜单,但与此同时,一种反…

作者头像 李华
网站建设 2026/4/19 18:43:22

私有化部署VibeThinker-1.5B的安全性保障措施

私有化部署VibeThinker-1.5B的安全性保障措施 在当前AI技术迅猛发展的背景下,越来越多企业开始将大语言模型(LLM)引入研发、教学和竞赛辅助等场景。然而,随着公有云API的广泛使用,数据隐私泄露、合规风险和网络延迟等问…

作者头像 李华
网站建设 2026/4/19 20:20:02

数据分类分级优选阵营:国内实力厂商汇总

在数据要素市场化配置与强监管政策的双重驱动下,数据分类分级已从早期的合规达标工具,升级为数据安全治理的核心底座与数据价值释放的前置支撑。随着GB/T 43697-2024《数据安全技术 数据分类分级规则》等国家标准的落地实施,企业对分类分级的…

作者头像 李华
网站建设 2026/4/19 23:12:55

2026想转行?渗透测试vs网安工程师vs安全运维,应该怎么选?

2025想转行?渗透测试vs网安工程师vs安全运维,应该怎么选? 9月,更是求职人眼中的“金九银十”黄金期,所以不少人在这个时候会有转行的想法,尤其是IT中人,都想进入到网安行业中来分一杯羹。 但是…

作者头像 李华