快慢指针寻找回路入口

1.快慢指针:
   快慢指针是指两个移动速度不同的指针,一个指针移动的步长大于另一个指针(多为2倍关系)。
2.有环必相遇:
   当慢指针到环里的时候,快指针已经在环里了,一快一慢肯定会相遇。
3.寻找入环口:
结论:当快慢指针相遇时,将快指针指向链表的起点,且步长与慢指针一样为速度为1,则慢指针与快指针相遇的地方就是环的入口。
原理:设环长:c,起点到环入口:x,起点到相遇点:y,相遇点到起点:z,V(快)=2V(慢)
   相遇时快指针在环上跑了m圈,慢指针为n圈。
   L(快)=x+y+m
c;
   L(慢)=x+y+nc;
   由V(快)=2
V(慢)知: L(快)=2* L(慢)
   =>2*(x+y+nc)=x+y+mc;
   =>x=-y+(m-2n)*c=c-y+(m-2n-1)*c=z+(m-2n-1)*c;
   假设此时快慢指针速度都为1,当快指针从初试位置开始跑过(m-2n-1) *c距离是,此时距入口处距离为z,而慢指针跑完(m-2n-1)*c(相当于(m-2n-1)圈)时在原位置即相遇位置,距入口处也为z。易知继续跑下去两指针会在入口处相遇。
4.应用:
   1.判断单链表是否为循环链表
   2.在有序链表中寻找中位数

猜你喜欢

转载自blog.csdn.net/MJ_Lee/article/details/88357699