Leetcode-141题 快慢指针

快慢指针解决链表中的环问题

问题描述

给定一个链表,判断链表中是否有环。环的起点在哪里,环的大小是多少。
示意图

一、边界条件

若链表没有环,那当快指针指到nullptr时,表示该链表没有环。

二、推导快慢指针相遇的地方

快指针速度:2
慢指针速度:1
在这里插入图片描述
当慢指针走到P2点时,不妨设快指针走到P1点。并设P1与P2间距离为D,
此时可列等式:
慢指针走的距离 * 2 =快指针走的距离
2 ∗ K = K + D + n ∗ R . 2*K =K + D+n * R. 2K=K+D+nR.
其中n为快指针已经走过环的圈数。

由上式可以推出
K = D + n ∗ R . K = D+n * R. K=D+nR.
由图中我们可以得知,P1与P2点相距D距离,则快指针追赶上慢指针则需要比慢指针多走(R-D)距离。
由此我们可以列式得出:
相距距离 / 速度差值 = 相距仍需要走的步数
R − D 2 − 1 = R − D , . \frac{R-D }{2-1}=R-D,. 21RD=RD,.
快指针的速度为2,那么我们就可以得到相遇的点为2(R-D)+D=2R-D,
也就是P3点,该点距离P2点的距离为D,与P1对称。
在这里插入图片描述

三、推导环的入口点

推导相遇过程中,我们得到了一个等式, K = D + n ∗ R . K = D+n * R. K=D+nR.
那么我们就可以根据这个等式,重新设置两个指针,速度相同,起点不同, 一个起点设置在链表的头结点,而另一个则设置在相遇结点,根据上述等式,我们可以得知,两结点相遇的地方就是环的入口点。

四、环的大小

得到环的入口点,只需要遍历一遍环,即可得到环的大小。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值