Given a linked list, return the node where the cycle begins. If there is no cycle, return null
.
Follow up:
Can you solve it without using extra space?
找到环开始的点
同样快慢指针,当相遇时,慢指针回到起点,快指针变成每次一步,他们相遇的点就是环开始的点:
证明:从head到环起点的距离为 X,环起点到相遇点距离为Y,相遇点到环起点距离为Z,则:
2*(X+Y)=X+Y+n*(Y+Z);
X+Y=n*(Y+Z);
X=n*(Y+Z)-Y=(n-1)*(Y+Z)+Z;
得证
public class Solution {
public ListNode detectCycle(ListNode head) {
ListNode pre = head;
ListNode post = head;
boolean flag = false;
while(post!=null&&post.next!=null){
post=post.next.next;
pre = pre.next;
if(pre==post){
pre=head;
flag=true;
break;
}
}
if(!flag)
return null;
while(pre!=post){
pre=pre.next;
post=post.next;
}
return pre;
}
}