2023/09/29:Floyd算法

不知道为啥记了这个
https://blog.csdn.net/Jasonchen1224/article/details/131276343

前言

龟兔赛跑算法,是一个可以在有限状态机、迭代函数或者链表上判断是否存在环,以及判断环的起点与长度的算法,需要使用两个指针,人为规定移动较快的快指针速度是移动较慢的慢指针的2倍

环的判定

可能出现两种情形:
1.快速指针达到链表尾,此时无环
2.快速指针在遍历时赶上慢指针,此时有环

算法逻辑

设a为链表头到环起点的距离,b为环起点到两指针第一次相遇的距离,c为环周长
相遇时,慢指针移动距离S1:
S1=a+b+nc;
快指针移动距离S2:
S2=a+b+m
c;
在两指针移动次数相同时,S2=2S1;
此时,可得:
a+b+m
c=2*(a+b+nc);
a+b=m
c-2nc=(m-2n)c=kc;
进行简化,可得:
a+b=k
c;
a=kc-b;
通过以上寻找环起点位置:
如果两指针相遇后,将头节点赋值给慢指针,快指针位置不变,以每次步长为1移动,快慢指针最后相遇在环起点位置,此时慢指针走过a,快指针走过k
c-b=a