寻找链表存在环时 环的头结点

偶然发现很多文章和牛客、leetcode上的说明都是错的,   大部分的公式貌似都以为fast结点多走一圈就和slow相遇, 貌似没有考虑到fast可能会多跑了n圈的结果.

fast结点每次走两步, slow结点每次走一步

公式如下:

假设链表头结点到环的头结点长度为A

环的头结点到第一次相遇的结点距离为B,

环的长度为 R

那么  slow走过的距离为 A  + B, fast走过的距离为A + nR + B

所以   d(fast) = 2d(slow) =>   2A + 2B = A + B + nR =>  A + B = nR => A = nR - B;

所以在第一次相遇的时候slow结点已经在圈内走过了 B这么长的距离, 这个时候我们再让链表头结点的指针 和  slow结点的指针一起走A这么长的距离后,   头结点的指针就走到了环的头结点位置,   slow结点 走过A距离也就相当于走了nR - B的距离。  加上他本身在环内已经走了B的距离, 所以就会回到环的头结点! (也就是2A + B  = nR + A)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值