环形链表的快慢指针相遇问题证明

证明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

即快慢指针相遇时,另一指针从初始点出发,会与慢指针相遇在环的入口

如有错误,欢迎指正,大家一起进步!

环形链表的快慢指针相遇问题证明相关推荐

  1. 环形链表的快慢指针相遇问题以及相遇位置的证明

    假设有这么一个环形链表 第一步 设慢指针走到环的入口处走了K个结点,则快指针走了2K个结点 则有 2 K − K = α + n C 2K-K=α + nC 2K−K=α+nC 其中,α是快指针距离环 ...

  2. leetcode 141. 环形链表(快慢指针解法)

    题目 思路 绝对的经典题目,快慢指针,慢指针一次走两步,快指针一次走一步,直到两指针相遇,则说明有环. 关于评论区看到的一种思路,本质是做标记.这个办法不是很好,一方面,如果测试用例足够全的话,标记内 ...

  3. 【LeetCode】【HOT】141. 环形链表(快慢指针)

    [LeetCode][HOT]141. 环形链表 文章目录 [LeetCode][HOT]141. 环形链表 package hot;class ListNode{int val;ListNode n ...

  4. 链表中快慢指针的应用

    目录 一.链表的中间结点 二.回文链表 三.链表中倒数第K个结点 四.删除链表的倒数第n个结点 五.环形链表 六.环形链表Ⅱ 一.链表的中间结点 给定一个头结点为 head 的非空单链表,返回链表的中 ...

  5. 数据结构链表之单链表的快慢指针——3

    单链表之快慢指针 单链表的快慢指针简介 快慢指针指链表中定义两个指针,两个指针的移动速度一快一慢,一般快指针移动步长为慢指针的两倍 快慢指针适合解决的几个典型问题 中间值问题 单向链表是否有环问题 有 ...

  6. 【Leedcode】环形链表必备的面试题和证明题(附图解)

    环形链表必备的面试题和证明题(附图解) 文章目录 环形链表必备的面试题和证明题(附图解) 前言 一.第一题 1.题目 2.思路 3.代码 4.延伸问题 (1)证明题一: (2)证明题二: 二.第二题 ...

  7. c 链表之 快慢指针 查找循环节点(转)

    上面分析了 根据这张图 推倒出 数学公式. 刚接触 不能一下弄明白.下面结合上面文章的分析.仔细推倒一下 , 一般设置 快指针 速度是 慢指针的2倍.及 快指针每次遍历两个指针, 慢指针每次遍历1个指 ...

  8. 试编写一个将双向循环链表逆置的算法_图解:链表的快慢指针,解决 80% 的链表面试题!...

    一.前言 链表是基本的数据结构之一,它与数组不同,数组在内存中存储,需要一块连续的内容空间来存储,对内存的要求比较高.例如我们需要 100MB 大小的数组,内存中就必须有一段连续的 100MB 的内存 ...

  9. 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 ...

最新文章

  1. 程序员效率低下的35个坏习惯
  2. 西工大计算机专业课考什么,我的西北工业大学计算机考研之路总结
  3. jsp 验证码以及验证码局部刷新
  4. Python实现1-9数组形成的结果为100的所有运算式
  5. [云炬创业基础笔记]第五章创业机会评估测试8
  6. 腾飞答不忘初心的三个问题
  7. selenium选错弹出层的下拉框
  8. Hibernate入门(二)——hibernateAPI详解
  9. linux fcntl函数,Linux C 学习之 - fcntl 函数
  10. 【重磅】《演化学习:理论与算法进展》| 南大周志华、俞扬、钱超重要成果...
  11. 极光尔沃:太空3D打印机首次亮相 航天领域应用潜力巨大
  12. vue.js开发微信公众号加载缓慢出现的白页问题-随笔
  13. 伯努利试验及概率方程 二项式分布 期望值与方差
  14. 压缩和解压缩文件(十一)
  15. 倪光南院士:构建安全可控的信息技术体系,云宏高安全的云计算关键核心技术先行
  16. 计算机工作功率,电脑功率(电脑一天要用多少电)
  17. opencv 凸包convexHull、道格拉斯-普克算法Douglas-Peucker algorithm、approxPloyDP 函数
  18. LaTex案例——制作三线表
  19. java-Base64编码工具类
  20. 第二次作业-熟悉使用工具

热门文章

  1. MATLAB实战系列(二十五)-MATLAB交错并联BUCK电路闭环PID设计及分析
  2. Windows7系统各种版本对照 你更适合哪一款?
  3. 【无标题】Python 应用POS信息写入JPG exif
  4. 关于Driver oracle.jdbc.OracleDriver claims to not accept jdbcUrl解决方法
  5. checkra1n iOS 13.3.1 越狱 + ipa脱壳
  6. Mouse.bat 模拟鼠标操作脚本
  7. CJMCU-Beetle Arduino Leonardo引脚编号对应关系
  8. 学习使用web of science查找文献
  9. 虚拟机VMware提示“无法获得VMCI驱动程序的版本:句柄无效”的解决方法
  10. 镶嵌数据集工具小结(二)镶嵌数据轮廓线与边界