环形链表的快慢指针相遇问题证明
环形链表的快慢指针相遇问题证明
证明1:慢指针一定在环形链表一圈内遇上
首先假设慢指针的每次只走1步,快指针每次走2步,当慢指针走了k次后,慢指针共走了k步,而快指针走了2k步。
假如说,快指针和慢指针一定会相遇,那么一定是在环内,同时快指针已经走了n圈环。此时该问题也就可以转变为一下问题何时有解
2 k − k = n B → k = n B ( n = 1 , 2 , . . . , N ) 2k - k = nB \rightarrow k = nB (n = 1,2,...,N) 2k−k=nB→k=nB(n=1,2,...,N)
当n=1时,此时有k=B,也就是慢指针走的k步等于环的长度。此时是否有解呢?显然是有的,因为 k ∈ [ 0 , A + B ] k \in [0, A+B] k∈[0,A+B]。所以肯定有一个值等于B。
而当 n ≥ 1 n≥1 n≥1 时,k = nB,则需要考虑A+B是否大于nB,此时不一定有解
因此慢指针一定在环形链表一圈内遇上得证。
证明2: 当两指针相遇后,a = c
假设慢指针slow 走了 l s l o w = a + b l_{slow} = a + b lslow=a+b
快指针走了 l f a s t = a + n ( b + c ) + b l_{fast} = a + n(b+c) + b lfast=a+n(b+c)+b
而有 2 l s l o w = l f a s t 2l_{slow} = l_{fast} 2lslow=lfast ,因此求得 2 ( a + b ) = a + n ( b + c ) + b → a = c + ( n − 1 ) ( b + c ) 2(a+b) = a + n(b+c) + b \rightarrow a = c + (n-1)(b+c) 2(a+b)=a+n(b+c)+b→a=c+(n−1)(b+c)
而我们在证明1中证明了当且仅当n=1时,必有解,因此上式可以化为 a = c a=c a=c
即快慢指针相遇时,另一指针从初始点出发,会与慢指针相遇在环的入口
如有错误,欢迎指正,大家一起进步!
环形链表的快慢指针相遇问题证明相关推荐
- 环形链表的快慢指针相遇问题以及相遇位置的证明
假设有这么一个环形链表 第一步 设慢指针走到环的入口处走了K个结点,则快指针走了2K个结点 则有 2 K − K = α + n C 2K-K=α + nC 2K−K=α+nC 其中,α是快指针距离环 ...
- leetcode 141. 环形链表(快慢指针解法)
题目 思路 绝对的经典题目,快慢指针,慢指针一次走两步,快指针一次走一步,直到两指针相遇,则说明有环. 关于评论区看到的一种思路,本质是做标记.这个办法不是很好,一方面,如果测试用例足够全的话,标记内 ...
- 【LeetCode】【HOT】141. 环形链表(快慢指针)
[LeetCode][HOT]141. 环形链表 文章目录 [LeetCode][HOT]141. 环形链表 package hot;class ListNode{int val;ListNode n ...
- 链表中快慢指针的应用
目录 一.链表的中间结点 二.回文链表 三.链表中倒数第K个结点 四.删除链表的倒数第n个结点 五.环形链表 六.环形链表Ⅱ 一.链表的中间结点 给定一个头结点为 head 的非空单链表,返回链表的中 ...
- 数据结构链表之单链表的快慢指针——3
单链表之快慢指针 单链表的快慢指针简介 快慢指针指链表中定义两个指针,两个指针的移动速度一快一慢,一般快指针移动步长为慢指针的两倍 快慢指针适合解决的几个典型问题 中间值问题 单向链表是否有环问题 有 ...
- 【Leedcode】环形链表必备的面试题和证明题(附图解)
环形链表必备的面试题和证明题(附图解) 文章目录 环形链表必备的面试题和证明题(附图解) 前言 一.第一题 1.题目 2.思路 3.代码 4.延伸问题 (1)证明题一: (2)证明题二: 二.第二题 ...
- c 链表之 快慢指针 查找循环节点(转)
上面分析了 根据这张图 推倒出 数学公式. 刚接触 不能一下弄明白.下面结合上面文章的分析.仔细推倒一下 , 一般设置 快指针 速度是 慢指针的2倍.及 快指针每次遍历两个指针, 慢指针每次遍历1个指 ...
- 试编写一个将双向循环链表逆置的算法_图解:链表的快慢指针,解决 80% 的链表面试题!...
一.前言 链表是基本的数据结构之一,它与数组不同,数组在内存中存储,需要一块连续的内容空间来存储,对内存的要求比较高.例如我们需要 100MB 大小的数组,内存中就必须有一段连续的 100MB 的内存 ...
- reorder-list——链表、快慢指针、逆转链表、链表合并
Given a singly linked list L: L0→L1→-→Ln-1→Ln, reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→- You must do th ...
最新文章
- 程序员效率低下的35个坏习惯
- 西工大计算机专业课考什么,我的西北工业大学计算机考研之路总结
- jsp 验证码以及验证码局部刷新
- Python实现1-9数组形成的结果为100的所有运算式
- [云炬创业基础笔记]第五章创业机会评估测试8
- 腾飞答不忘初心的三个问题
- selenium选错弹出层的下拉框
- Hibernate入门(二)——hibernateAPI详解
- linux fcntl函数,Linux C 学习之 - fcntl 函数
- 【重磅】《演化学习:理论与算法进展》| 南大周志华、俞扬、钱超重要成果...
- 极光尔沃:太空3D打印机首次亮相 航天领域应用潜力巨大
- vue.js开发微信公众号加载缓慢出现的白页问题-随笔
- 伯努利试验及概率方程 二项式分布 期望值与方差
- 压缩和解压缩文件(十一)
- 倪光南院士:构建安全可控的信息技术体系,云宏高安全的云计算关键核心技术先行
- 计算机工作功率,电脑功率(电脑一天要用多少电)
- opencv 凸包convexHull、道格拉斯-普克算法Douglas-Peucker algorithm、approxPloyDP 函数
- LaTex案例——制作三线表
- java-Base64编码工具类
- 第二次作业-熟悉使用工具
热门文章
- MATLAB实战系列(二十五)-MATLAB交错并联BUCK电路闭环PID设计及分析
- Windows7系统各种版本对照 你更适合哪一款?
- 【无标题】Python 应用POS信息写入JPG exif
- 关于Driver oracle.jdbc.OracleDriver claims to not accept jdbcUrl解决方法
- checkra1n iOS 13.3.1 越狱 + ipa脱壳
- Mouse.bat 模拟鼠标操作脚本
- CJMCU-Beetle Arduino Leonardo引脚编号对应关系
- 学习使用web of science查找文献
- 虚拟机VMware提示“无法获得VMCI驱动程序的版本:句柄无效”的解决方法
- 镶嵌数据集工具小结(二)镶嵌数据轮廓线与边界