链表 —— 142 环形链表Ⅱ 难点拆解!快慢指针如何找到环入口?动图解原理!
力扣 142 环形链表Ⅱ给定一个链表的头节点head返回链表开始入环的第一个节点。如果链表无环则返回null。如果链表中有某个节点可以通过连续跟踪next指针再次到达则链表中存在环。 为了表示给定链表中的环评测系统内部使用整数pos来表示链表尾连接到链表中的位置索引从 0 开始。如果pos是-1则在该链表中没有环。注意pos不作为参数进行传递仅仅是为了标识链表的实际情况。不允许修改链表。示例 1输入head [3,2,0,-4], pos 1输出返回索引为 1 的链表节点解释链表中有一个环其尾部连接到第二个节点。示例 2输入head [1,2], pos 0输出返回索引为 0 的链表节点解释链表中有一个环其尾部连接到第一个节点。示例 3输入head [1], pos -1输出返回 null解释链表中没有环。提示链表中节点的数目范围在范围[0, 104]内-105 Node.val 105pos的值为-1或者链表中的一个有效索引这道题跟着逻辑走思路很清晰但实际上需要严谨证明和反复琢磨才能真正理解并独立解题主要解决两点判断链表是否成环如果有环那么环的入口在哪里一. 是否成环这里可以采用双指针分别定义快慢指针均从头节点出发其中fast每次移动两个节点而slow每次移动一个节点如果fast和slow在移动途中相遇说明该链表成环。为什么快慢指针相遇就说明成环因为是快指针先入环慢指针后入环如果fast指针和slow指针相遇的话一定是在环中相遇在环内相遇就说明肯定成环了。为什么有环一定会相遇本质上是因为两指针存在速度差在环内绕环移动时快指针一定会追上慢指针。这是因为fast走两步slow走一步对slow来说fast是一点一点接近它的所以两者一定会在环内某一节点处相遇。画一个环让fast在任意一个节点开始追赶slow会发现展开后都是下图这种情况此时按照定义fast往前走一次两步slow走一次一步两者就会在 3 处相遇。完整动画演示如下图二. 入口在哪里假设从头结点到入口节点的节点数为x入口节点到两指针相遇节点的节点数为y从相遇节点再到入口节点的节点数为z 如图所示slow指针走过的节点数为x yfast指针走过的节点数为x y n * (y z)其中n表示快指针追慢指针的过程中绕过的圈数。由于快指针一次走两个节点慢指针一次走一个故快指针走过的节点数是慢指针的2倍。也就是2 * (x y) x y n * (y z)两边消一个x y化简得x y n * (y z)。要找到是环形入口节点也就是x所以把x提出来放左边得x n * (y z) - y。右边提一个y z出来化简得x (y z) * (n - 1) z。化简到这一步不妨设环绕圈数n为1即可得x z。这也就是说从头结点和相遇节点同时出发一个指针两个指针每次只走一个节点 那么当这两个指针相遇时所在处就是环形入口的节点。那么**n如果大于1** 是什么情况呢其实这种情况和n为1的时候是一样的一样可以通过这个方法找到入口节点只不过index1指针在环里多转了(n-1)圈然后再遇到index2相遇点依然是环形的入口节点。至此我们完成了一开始提出的两个问题✅下面是完整力扣代码class Solution { public: ListNode *detectCycle(ListNode *head) { ListNode* fast head; ListNode* slow head; while(fast ! nullptr fast-next ! nullptr) { slow slow-next; fast fast-next-next; if (slow fast) { ListNode* index1 fast; ListNode* index2 head; while (index1 ! index2) { index1 index1-next; index2 index2-next; } return index2; } } return nullptr; } };

相关新闻

AnimeGarden终极指南:一站式动漫资源聚合平台如何解决你的追番痛点

AnimeGarden终极指南:一站式动漫资源聚合平台如何解决你的追番痛点

AnimeGarden终极指南:一站式动漫资源聚合平台如何解决你的追番痛点 【免费下载链接】AnimeGarden 動漫花園 镜像站 | 动画 BT 资源聚合站 | 动画 BT 资源开放接口 项目地址: https://gitcode.com/gh_mirrors/an/AnimeGarden 你是否曾经为了寻找最新的动漫资源…

2026/10/4 11:08:02 阅读更多 →
多模态RAG把检索变成图搜索 多跳推理稳了

多模态RAG把检索变成图搜索 多跳推理稳了

多模态检索增强生成有个老问题:单跳问题("这张图里有什么")检索一次就够了,一旦问题需要多跳推理("这张图对应的论文里,作者还引用了哪些相关工作的方法"),每一…

2026/10/5 4:59:51 阅读更多 →
C++与OpenGL 3D游戏开发:从零构建核心渲染管线与实战指南

C++与OpenGL 3D游戏开发:从零构建核心渲染管线与实战指南

1. 项目概述:为什么选择C与OpenGL作为3D游戏的基石如果你对游戏开发感兴趣,尤其是想从底层理解图形是如何被绘制到屏幕上的,那么“C OpenGL”这个组合几乎是绕不开的经典路径。这不仅仅是一个技术栈的选择,更是一种开发哲学的体现…

2026/10/13 9:15:21 阅读更多 →

最新新闻

DeepSeek Harness 插件体系从入门到精通:安装、配置与离线部署全指南

DeepSeek Harness 插件体系从入门到精通:安装、配置与离线部署全指南

1. 从零理解 DeepSeek Harness 插件体系到底在解决什么问题很多人第一次接触 DeepSeek Harness 的时候,脑子里冒出来的第一个问题往往是:这玩意儿跟直接用命令行调模型有什么区别?我一开始也是这个反应。后来真正把插件机制跑通之后才明白&am…

2026/10/14 14:40:57 阅读更多 →
Zabbix监控MariaDB实践:核心指标、触发器与告警配置全解析

Zabbix监控MariaDB实践:核心指标、触发器与告警配置全解析

先聊点实际的。上个月我接手了一台总是半夜告警的数据库服务器,CPU、内存指标看起来都没问题,Zabbix主机层面一切都是绿的,可业务方就是反馈查询慢、页面转圈。后来一查,问题全在MariaDB自身的连接数被打满、慢查询堆积上。主机活…

2026/10/14 14:40:57 阅读更多 →
TypeScript入门指南:静态类型与工程实践

TypeScript入门指南:静态类型与工程实践

1. TypeScript 基础入门:为什么选择它?第一次接触 TypeScript 是在 2016 年维护一个大型前端项目时。当时 JavaScript 代码已经膨胀到 3 万行,每次修改功能都像在雷区拆弹——你永远不知道哪个变量的类型变化会引发连锁崩溃。直到团队引入 Ty…

2026/10/14 14:40:56 阅读更多 →
博学谷习题界面开发实战:Android ListView自定义Adapter与判分逻辑实现

博学谷习题界面开发实战:Android ListView自定义Adapter与判分逻辑实现

做这个习题界面之前,我其实纠结了一段时间。博学谷这个模拟在线学习App做到第十一期,前面的章节页、详情页、视频播放流程都已经跑通了,用户能浏览课程、能看介绍,但一直都缺一个自我检验的入口。习题界面就是补上这个缺口&#x…

2026/10/14 14:40:56 阅读更多 →
三维模型导入技术解析与星图云实战指南

三维模型导入技术解析与星图云实战指南

1. 三维模型导入的核心价值与挑战在数字内容创作领域,三维模型就像建筑师的砖瓦。最近半年我参与了17个跨行业的三维项目,发现模型导入环节平均消耗了团队23%的有效工作时间。其中格式兼容性问题导致的返工占比高达68%,这个数据让我意识到系统…

2026/10/14 14:40:56 阅读更多 →
ComfyUI本地部署全攻略:从整合包到手动部署,跑通AI绘画工作流

ComfyUI本地部署全攻略:从整合包到手动部署,跑通AI绘画工作流

在家用电脑上折腾出一个自己的 ComfyUI,这事说难不难,说简单,又确实能把一大批人挡在门外。我见过太多人收藏了十几篇部署教程,结果打开一看全是"打开命令行输入 pip install xxx",人直接就懵了;…

2026/10/14 14:39:56 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →