Given a linked list, return the node where the cycle begins. If there is no cycle, return null.
Follow up:
Follow up:
Can you solve it without using extra space?
分析:
如图:
如图所示:假设有两个指针p1和p2,p1每次走1步,p2每次走2步,从头结点都环开始步数是X,环的步数是Y,从环开始到p1和p2相遇的距离是K步,用时t,则:
p1:t=X+mY+K
p2:2t=X+nY+K(m,n为任意整数)
整理得,(m-2n)Y=X+K,则:
从相遇位置开始p2走到环开始位置的步数等于X。
AC代码:
public class Solution {
public ListNode detectCycle(ListNode head) {
ListNode slowNode = head;
ListNode fastNode = head;
// find the meeting node
while( fastNode != null && fastNode.next != null ){
slowNode = slowNode.next;
fastNode = fastNode.next.next;
if( slowNode == fastNode )
break;
}
if( fastNode == null || fastNode.next == null)
return null;
// find the cycle begin
slowNode = head;
while( slowNode != fastNode ){
slowNode = slowNode.next;
fastNode = fastNode.next;
}
return fastNode;
}
}