1. 程式人生 > >LeetCode-Linked List Cycle

LeetCode-Linked List Cycle

尋找連結串列是否有環
方法是快慢指標

這裡寫圖片描述

第一次相遇時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; } }