floyd判圈算法

floyd判圈算法又称龟兔赛跑算法

算法流程

两个指针(P1,P2)

(P1)每次向后跳一次

(P2)每次向后跳两次

显然,如果(P1,P2)相遇才有环

现在我们想求环长和环的起点.

设起点到环的距离为(len)

环的起点离相遇点距离(rem)

设两个指针分别走了(p,q)

那么,(p=len+rem+A*L, q=len+rem+B*L)

又有(2p=q)

可以得到(p=(A-B)L)

说明了(p,q)(L)的倍数

我们再把(p)挪回起点,(p,q)同时每次走一步,直到相遇

那么(q=2p+len)

等于(q)从起点走了(len)步然后走了(2(A-B))

所以(p,q)会在环的起点处相遇.

然后继续跳即可求出环长.

原文地址:https://www.cnblogs.com/zzy2005/p/11305660.html