LeetCode 142. 环形链表 II 快慢指针证明

题目要我们寻找一个链表中的是否有环,有环的话找出入环的第一个节点。

比较快的方式便是通过快慢指针来判别,快的指针从头开始每次走两步,慢的指针从开始每次走一步,若有环,他们必将在某一点处相遇。

就好像在操场上跑步,有跑的慢的,也有跑的快的,跑得快的会多与慢的相遇。

假设1是起点,2是入环点,3是相遇点,其中分别经过A、B、C三段路
假设1是起点,2是入环点,3是相遇点,其中分别经过A、B、C三段路。

神奇的是,从他们从相遇点3开始,只要走与A等长的路,便能到达入环点2,下面给出证明:

在相遇的时候,慢指针一共走了A+B的路程,快指针一共走了A+N*(B+C)+B的路程,其中的N是指快指针在相遇前,绕环走了几圈。可以想象如果A特别长,而环回路特别短的话,快指针因为提前进入环而在里面转了很多圈。

快指针走的路程是慢指针的两倍=》2*(A+B)=A+N*(B+C)+B
可以解出 A=N*(B+C)-B=(N-1)*(B+C)+C

也就是说,当快指针和慢指针在3除相遇时,再走等同于A长度的路程,即(N-1)*(B+C)+C,在环中转了 N-1一圈后,再走C的长度的距离,便一定会到达A点。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值