news 2026/9/16 19:29:10

链表专题(六):数学与指针的完美结合——「环形链表 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/9/6 23:22:57

Linux crontab定时任务:每天凌晨自动更新模型镜像

Linux crontab定时任务:每天凌晨自动更新模型镜像 在AI模型快速迭代的今天,一个看似微小的版本更新,可能就决定了推理结果的成败。尤其是在数学推导、算法生成这类对逻辑严密性要求极高的场景中,哪怕只是优化了某类边界的处理方式…

作者头像 李华
网站建设 2026/9/14 0:29:48

iPad Pro手写输入优化:数学公式识别+VibeThinker求解

iPad Pro手写输入优化:数学公式识别 VibeThinker求解 在一场高校数学建模竞赛的现场,一名学生用Apple Pencil在iPad Pro上快速写下一道复杂的微分方程。笔尖刚落,屏幕便已呈现出完整的求解过程——从变量替换到积分变换,每一步推…

作者头像 李华
网站建设 2026/9/10 3:42:50

为什么你的Docker镜像越来越胖?一文找出元凶并解决

第一章:为什么你的Docker镜像越来越胖?当你频繁更新应用并构建新的 Docker 镜像时,是否发现镜像体积不断膨胀?这不仅影响部署速度,还增加了存储和传输成本。根本原因往往在于镜像构建过程中的“层”积累机制——每一次…

作者头像 李华
网站建设 2026/9/7 6:57:37

2026必备!本科生毕业论文神器TOP10:一键生成论文工具测评

2026必备!本科生毕业论文神器TOP10:一键生成论文工具测评 2026年本科生论文写作工具测评:为何需要这份榜单? 随着高校教育的不断升级,本科生在毕业论文写作中的要求也日益提高。从选题构思到文献综述,再到格…

作者头像 李华
网站建设 2026/9/15 6:13:08

揭秘Docker资源占用异常:如何用3个工具精准定位问题根源

第一章:Docker资源监控的核心价值在现代云原生架构中,容器化应用的动态性和高密度部署特性使得资源管理变得复杂。Docker资源监控不仅帮助运维团队实时掌握容器的CPU、内存、网络和磁盘使用情况,还为性能调优、故障排查和容量规划提供了关键数…

作者头像 李华