news 2026/4/25 19:39:40

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

Docker健康检查总失败?,掌握这4种排查技巧立刻见效

第一章:Docker健康检查失败的常见现象与影响在容器化应用部署过程中,Docker 健康检查(HEALTHCHECK)是保障服务可用性的关键机制。当健康检查失败时,容器虽可能仍在运行,但其提供的服务已无法正常响应请求&a…

作者头像 李华
网站建设 2026/4/18 12:36:07

Reddit热门帖复现:国外网友如何评价这款中国小模型

Reddit热门帖复现:国外网友如何评价这款中国小模型 在AI领域,一场静悄悄的变革正在发生。当全球大厂还在竞相推出千亿参数、动辄耗费数百万美元训练的“巨无霸”模型时,一款来自中国的15亿参数小模型却在Reddit上引发了热烈讨论——它叫 Vibe…

作者头像 李华
网站建设 2026/4/18 13:14:15

显存不足怎么办?量化版VibeThinker即将发布预告

显存不足怎么办?量化版VibeThinker即将发布预告 在消费级显卡上跑不动大模型的痛,每个本地AI爱好者都懂。明明手握RTX 3060,却因为“CUDA out of memory”而被迫放弃本地推理——这种尴尬正成为过去式。随着轻量高效模型与量化技术的结合突破…

作者头像 李华
网站建设 2026/4/25 2:45:25

‌混沌工程实战:在K8s集群注入网络延迟,我发现了微服务的致命连锁故障‌——含故障注入YAML模板与监控配置指南

本文通过混沌工程实验模拟K8s生产环境网络延迟,揭露微服务架构中隐藏的级联故障链。实测数据表明:当服务间延迟超过800ms时,订单系统的故障传播速度呈指数级增长。文中提供可复现的ChaosMesh故障注入模板及PrometheusGranafa监控方案&#xf…

作者头像 李华
网站建设 2026/4/16 10:20:30

学术研究推荐:VibeThinker作为轻量推理基线模型的价值

VibeThinker-1.5B:轻量模型如何在高强度推理中突破参数限制? 在当前大模型“军备竞赛”愈演愈烈的背景下,千亿参数、万卡集群似乎成了前沿AI研究的标配门槛。然而,对于大多数高校实验室、独立研究者或资源有限的开发者而言&#…

作者头像 李华
网站建设 2026/4/19 0:19:54

Docker资源监控避坑指南:8个常见错误配置及正确做法

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

作者头像 李华