1.快慢指针
快慢指针是指两个移动速度不同的指针,一个指针移动的步长大于另一个指针(多为2倍关系)。
2.快慢指针应用
- 判断单链表是否为循环链表(寻找回路入口)
- 在有序链表中寻找中位数
3.快慢指针寻找回路入口 LEETCODE287
3.1有环必相遇
当慢指针到环里的时候,快指针已经在环里了,一快一慢肯定会相遇。
3.2寻找入环口:
结论:
当快慢指针相遇时,将快指针指向链表的起点,且步长与慢指针一样为速度为1,则慢指针与快指针相遇的地方就是环的入口。
原理:
设环长:c,起点到环入口:x,起点到相遇点:y,相遇点到起点:z,V(快)=2* V(慢);
相遇时快指针在环上跑了m圈,慢指针为n圈;
L(快)=x+y+m* c;
L(慢)=x+y+n* c;
由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.快慢指针寻找寻找中位数 LEETCODE876
快指针的移动速度是慢指针移动速度的2倍,因此当快指针到达链表尾时,慢指针到达中点。