判断是否又环,并找到入口:
在第一次相遇的位置,快指针比满指针多走了N圈,相对于从head点的位置,多走了一个环形圈长度的位移;
从这里开始,一个从head出发,一个从此节点出发,每次都一步,直到相遇就是环的入口。
public class Solution {
public ListNode detectCycle( ListNode head ) {
if( head == null || head.next == null ){
return null;
}
// 快慢指针
ListNode slow = head, fast = head;
while( fast != null && fast.next != null){
slow = slow.next;
fast = fast.next.next;
if( fast == slow ){ //说明有环
break;
}
}
if( fast == null || fast.next == null ){
return null;
}
// 说明有环,求环的起始节点
slow = head;
while( fast != slow ){
slow = slow.next;
fast = fast.next;
}
return sp;
}
}