问题
判定链表是否有环,如果存在环,找到环的起始节点。
思路
用两个指针slow,fast,slow指针一次走一步,fast指针一次走两步。如果他们相遇则存在环。那如何找到环的起始节点那?当他们相遇时,让slow指针回到原来的起点。fast指针还在相遇的节点,然后两个指针一次走一步,当他们相遇时就是环的起始节点。证明:
第一次相遇时,slow指针走过的路程S1=非环部分长度+弧A的长度
fast指针走过的指针S2=非环部分长度+弧A的长度+n*环的长度
而S2=S1*2,由以上三式得:
非环部分长度=n*环的长度-弧A的长度。
让指针A回到起始点后,走过一个非环部分长度,指针B走过了相等的长度,也就是n * 环长 - 弧A长,正好回到环的开头。
int FindBeginofLoop(ListLode head){
ListNode slow=head,fast=head;
boolean loopExist = false;
if(head == null) return false;
while(fast.getNext()!=null && fast.getNext().getNext()!=null){
slow = slow.getNext().
fast = fast.getNext().getNext();
if(slow == fast){
loopExist = true;
break;
}
}
if(loopExist){
slow = head;
while(slow != fast){
fast = fast.getNext();
slow = slow.getNext();
}
return slow;
}
return null;
}
}