题目描述:
和环形链表相比,就是要返回相遇的那个结点
方法:
利用双指针:
-
定义快结点和慢结点,快结点一次走两步,慢结点一次一步
首先判断是否有环,如果无环直接退出- 其中,当fast=slow 时,说明有环,这时候要记下他们相遇的那个位置
-
假如,在环路前面节点数为a,环路里面,节点数为b,那么,
当快结点和慢结点相遇:
- 快结点走了:S1=2*S2
- 慢结点走了:S1-S2=n*b
得S2= nb
-
对于环路入口处,慢结点走到入口处要走,S2=a+nb,而在快结点与慢结点相遇的位置,慢结点已经走了nb,那么,慢结点只要再走a,那时候的位置就是在入口处。
-
当然,无环的路不能直接确定结点数,所以可以让节点重新从head位置开始走,走到入口位置时,新结点和慢结点刚好相遇,返回此处结点即为环路入口
代码:
public class Solution {
public ListNode detectCycle(ListNode head) {
ListNode fast = head, slow = head;
while(true){
if(fast==null||fast.next==null){ return null; }
fast = fast.next.next;
slow = slow.next;
if(fast == slow){ break;}
}
fast = head;
while(fast!=slow){
fast=fast.next;
slow=slow.next;
}
return fast;
}
}