LeetCode 141.环形链表

发布时间:2026/10/27 21:35:32

LeetCode 141.环形链表 目录1 题目概述2 题目解法3 证明原题链接环形链表1 题目概述给你一个链表的头节点 head 判断链表中是否有环。如果链表中有某个节点可以通过连续跟踪 next 指针再次到达则链表中存在环。如果链表中存在环 则返回 true 。 否则返回 false 。示例1在遍历此链表时指针会在 2 到 -4 的这段区域不断地循环遍历因此链表中存在环示例2在遍历此链表时指针不会循环遍历链表最终会停止因此链表中不存在环2 题目解法在解决这道题目时所采用的方法是快慢指针法在使用快慢指针时保证慢指针每次走一步快指针每次走两步最终快慢指针相遇就能说明链表中存在环。如果快指针为空或快指针的下个结点为空则不存在环。存在环不存在环偶数个结点时奇数个结点时代码如下boolhasCycle(structListNode*head){structListNode*slowhead;structListNode*fasthead;while(fastfast-next){slowslow-next;fastfast-next-next;if(slowfast)returntrue;}returnfalse;}3 证明为什么慢指针走一步快指针走两步的话有环时它们一定能相遇呢如果慢指针走一步快指针走三步四步行不行呢首先来说说为什么慢指针走一步快指针走两步的话有环时它们一定能相遇以下面的链表为例在 slow 指针逐渐接近环时fast 指针已经在环内走了一段时间最终 slow 指针进入环时呈现出来的形式是这样的此时fast 和 slow 的距离为 4继续移动 slow 和 fast此时fast 和 slow 的距离为 3继续移动此时fast 和 slow 的距离为 2继续移动此时fast 和 slow 的距离为 1继续移动此时fast 和 slow 的距离为 0于是我们可以发现在快指针一次走两步慢指针一次走一步的情况下快慢指针之间的距离会逐渐缩小每次缩小1直到最后距离差为0因此我们可以假设在 slow 指针刚进环时fast 和 slow 之间的距离为 N在 fast 和 slow 逐渐移动的过程中距离 N 会不断减 1变成 N-1N-2N-3 … 1 0当距离为 0 时fast 和 slow 即可相遇因此在快指针一次走两步慢指针一次走一步的情况下两指针一定可以相遇再来说说如果慢指针走一步快指针走三步四步能不能让它们相遇在这里以慢指针走一步快指针走三步为例仍然假设在 slow 指针刚进环时fast 和 slow 之间的距离为 N此时如果让快慢指针开始移动那么快慢指针之间的距离差会逐渐减少 2变成 N-2N-4N-6N-8 …如果N 是偶数则距离最终会变成 0如果N 是奇数则距离最终会 变成 -1距离是 0表示 slow 和 fast 相遇距离是 -1表示 slow 和 fast 刚好错过无法相遇在这个情况下需要再次遍历环假设环的长度为 C那么fast 与 slow 的距离就是 C-1在遍历的过程中C-1又会不断地减2C-1 为偶数时最终会变成 0最终会相遇C-1 为奇数时最终会变成 -1最终不会相遇根据前面的结论如果一直不相遇那么 N 是奇数C是偶数真的是这样吗如果环内的结点较少环外的结点较多则在慢指针刚进环时快指针很有可能已经走了很多圈因此我们可以假设链表的起始位置到环的第一个结点的距离为 L快慢指针的距离为 N环的长度为 C此时slow 走过的距离为 Lfast 走过的距离为 L (x * C) (C - N) (x为走过的环的个数)又因为 fast 的速度为 slow 的三倍则距离也为 slow 的三倍因此可以得到等式 3L L (x * C) (C - N)化简可得 2L (x 1) * C - N根据我们得到的结论如果一直不相遇那么 N 是奇数C 是偶数将这个条件代入式中会发现并不成立因为偶数 ≠ 偶数 - 奇数在这样的情况下N 和 C 的取值只有下面两种情况N 为奇数C 为奇数N 为偶数C 为偶数当 N 为奇数C 为奇数时C - 1为偶数最终距离会为0快慢指针第一次不会相遇遍历第二次肯定会相遇当 N 为偶数时快慢指针一定会相遇所以slow 走一步fast走三步四步甚至更多时仍然会相遇
延伸阅读

更多相关文章

2026/10/27 21:33:19

Python装饰器深度解析:从核心原理到高级应用实战

1. 项目概述:为什么装饰器是Python开发者的必修课?如果你写过一段时间的Python,尤其是在接触Web框架(比如Flask、Django)或者一些测试框架时,一定见过那个神奇的“”符号。它看起来像语法糖,用起…

2026/10/27 21:31:10

金蝶KIS V8.1兼容性配置与数据迁移实战指南

简介:金蝶KIS标准版迷你版V8.1是一款专为小型企业设计的轻量级财务信息化软件,聚焦财务管理、进销存与固定资产等核心业务场景,兼顾操作简易性与财税合规性,适合无专职IT人员、预算有限但需规范账务处理的初创及小微企业使用。资源…

2026/10/27 21:31:10

拆解“无可挑剔”:从工程标准到用户体验的品质指南

"impeccable"这个词,我盯了它很久。它躺在某个项目的代码注释里,又在设计师的交付说明里出现,最后出现在我的个人任务清单上。于是我想,干脆写一篇关于"无可挑剔"的文章吧——但不是在讲完美主义,…

2026/10/27 21:31:10

华为生态体系:技术赋能与协同创新的千亿增长密码

1. 千亿营收背后的生态体系进化论 去年第一次在华为全联接大会上听到许超分享"伙伴华为"体系时,我就意识到这套模式正在发生质变。当时他举了个例子:某省一家年营收不到500万的本地集成商,接入华为生态体系三年后,单年项…

2026/10/27 21:31:10

基于RT-Thread与ESP8266的智能头盔物联网开发实践

1. 项目背景与核心需求 在工业安全、骑行运动等领域,智能头盔正成为重要的物联网终端设备。基于RT-Thread实时操作系统开发的智能头盔,通过集成ESP8266 WiFi模块实现联网功能,并将传感器数据上传至OneNET物联网平台,构成了完整的端…

2026/10/27 21:26:10

Modbus功能码与四区内存映射:8字节报文解析避坑指南

简介:这份PDF面向工业自动化、嵌入式与PLC通信初学者,围绕Modbus协议的功能码含义与报文实例展开,可用于理解主从设备如何读写线圈、输入状态、保持寄存器与输入寄存器,并解决现场通信调试中报文构造与解析不清的问题。包内共1个P…

2026/10/27 14:24:03

全国计算机二级C语言真题PDF高效刷题指南

简介:这份PDF是全国计算机二级C语言考试的试题与答案解析,专为备考二级C语言的考生准备。内容涵盖C语言特点与设计理念、程序基本组成单位、main函数执行流程、函数嵌套调用规则、标识符命名规范、整型实型字符型数据类型、八进制十六进制数合法形式、运…

2026/10/27 9:34:54

requests+BeautifulSoup:爬虫抓取h1标题的入门实战指南

简介:一份以实战为导向的Python爬虫入门资源,面向具备基本编程基础、希望快速掌握网络数据抓取的初学者,可解决从零编写简单爬虫的常见困惑。实例以requests库发送HTTP请求、BeautifulSoup解析HTML文档,完整演示从网页中提取 标题…

2026/10/27 0:59:21

递推最小二乘参数辨识MATLAB编程:二阶系统与渐消记忆实现

简介:这是一篇面向控制系统、信号处理与机器学习等领域学习者的最小二乘参数辨识程序说明文档。资源共包含一个docx格式文档,压缩包大小七十八KB,内容围绕递推最小二乘算法和渐消记忆最小二乘算法展开:先构造一个极点位于单位圆内…

2026/10/27 0:02:28

WorkBuddy_新建任务与工作模式19_“模式选错”的典型代价

“模式选错”的典型代价 摘要 在软件工程中,设计模式、架构模式、并发模式乃至团队协作模式的选择,往往在项目早期就决定了后续的开发效率和维护成本。本文通过多个真实场景,剖析“模式选错”带来的典型代价——包括返工成本、技术债务累积、…

2026/10/27 0:02:28

WorkBuddy_新建任务与工作模式20_新手推荐路径

新手推荐路径 摘要 在 AI 辅助开发工具快速普及的今天,新手面对最多的困惑往往不是"工具够不够强",而是"我该从哪一步开始用"。本文提出一条经过实践验证的三阶段学习路径:先从 Ask(问答式交互)起…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑