LeetCode-Linked List Cycle
阿新 • • 發佈:2019-02-10
尋找連結串列是否有環
方法是快慢指標
第一次相遇時slow走過的距離:a+b,fast走過的距離:a+b+c+b。
因為fast的速度是slow的兩倍,所以fast走的距離是slow的兩倍,有 2(a+b) = a+b+c+b,可以得到a=c
slow肯定沒有走夠超過一圈,在第一圈的中間停下來。假設直接就在圓上,則必定slow走一圈相遇,若前面還有一截,則不必等到一圈即可相遇。同時起步是最遠的距離。
public class Solution {
public ListNode detectCycle(ListNode head) {
ListNode slow = head;
ListNode fast = head;
while (fast != null && fast.next != null){
slow = slow.next;
fast = fast.next.next;
if(slow == fast)
break;
}
if(fast == null || fast.next == null)
return null;
slow = head;
while(slow != fast){
slow = slow.next;
fast = fast.next;
}
return fast;
}
}