news 2026/9/2 22:28:17

链表专题(六):数学与指针的完美结合——「环形链表 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/2 12:46:25

字符串哈希冲突规避策略:AI给出多组参数建议

字符串哈希冲突规避策略:AI给出多组参数建议 在算法竞赛和高性能系统开发中,一个看似简单却暗藏玄机的问题时常浮现:两个不同的字符串,为何会“意外”地拥有相同的哈希值?这并非程序出错,而是哈希冲突的经典…

作者头像 李华
网站建设 2026/8/26 10:38:34

从零开始部署VibeThinker-1.5B-APP:Jupyter一键启动脚本使用教程

从零开始部署VibeThinker-1.5B-APP:Jupyter一键启动脚本实战指南 在算法竞赛训练营里,一个学生正为一道动态规划题卡壳。他尝试向云端大模型提问,却因高昂的API费用望而却步——每轮交互成本超过0.1美元,一次完整调试可能耗资数元…

作者头像 李华
网站建设 2026/8/28 11:10:29

GitHub镜像推荐:一键部署VibeThinker-1.5B-APP进行算法竞赛训练

VibeThinker-1.5B-APP:轻量级推理模型的平民化实践 在算法竞赛的世界里,一个困扰无数选手的现实问题始终存在:当你卡在一道中等难度以上的题目上时,除了翻看题解区、搜索博客或等待社区回复,是否有一种更高效的方式能即…

作者头像 李华
网站建设 2026/8/27 2:07:59

精选9款免费论文查重工具,每日不限次数轻松检测

论文查重免费工具排行榜:9大平台每日不限次推荐 核心工具对比速览 工具名称 查重速度 降重效果 特色功能 适用场景 aicheck 极快 重复率可降30% 专业术语保留 高重复率紧急处理 aibiye 中等 逻辑优化明显 学术表达增强 提升论文质量 askpaper 快 …

作者头像 李华
网站建设 2026/9/1 3:28:24

9大免费论文查重工具排行榜,每日不限次数随时查

论文查重免费工具排行榜:9大平台每日不限次推荐 核心工具对比速览 工具名称 查重速度 降重效果 特色功能 适用场景 aicheck 极快 重复率可降30% 专业术语保留 高重复率紧急处理 aibiye 中等 逻辑优化明显 学术表达增强 提升论文质量 askpaper 快 …

作者头像 李华
网站建设 2026/9/2 18:52:01

Docker镜像优化十大陷阱(99%开发者都踩过的坑)

第一章:Docker镜像大小优化的十大陷阱概述在构建高效、轻量的容器化应用时,Docker镜像大小直接影响部署速度、资源占用和安全性。然而,在优化过程中开发者常陷入一些看似合理却适得其反的误区。理解这些陷阱有助于制定更科学的镜像构建策略。…

作者头像 李华