偶然发现很多文章和牛客、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)