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

偶然发现很多文章和牛客、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的距离, 所以就会回到环的头结点!

猜你喜欢

转载自blog.csdn.net/qq_38835878/article/details/88073825
今日推荐