Leetcode-142. 環形連結串列 II

浮生未歇x發表於2020-10-09

給定一個連結串列,返回連結串列開始入環的第一個節點。 如果連結串列無環,則返回 null。

為了表示給定連結串列中的環,我們使用整數 pos 來表示連結串列尾連線到連結串列中的位置(索引從 0 開始)。 如果 pos 是 -1,則在該連結串列中沒有環。

說明:不允許修改給定的連結串列。

來源:力扣(LeetCode)

思路說明

設:入環節點為M,入環之前路徑長度為a(不包括入環節點M),環長度為b。慢指標和快指標第一次相遇時慢指標走了s步,快指標走了f步。
顯然:f=2s,f=s+nb
即:s=nb,f=2nb。
又:從出發走a+nb步一定可以到M,因此此時讓慢指標走a步就可以找到M。
因此相遇後,把快指標移到head節點,同時和慢指標一步一步前移,二者一定在M處相遇。

程式碼如下:

public class Solution {
    public ListNode detectCycle(ListNode head) {
        ListNode slow=head;
        ListNode fast=head;
        while(fast!=null&&fast.next!=null){
            fast=fast.next.next;
            slow=slow.next;
            if(slow==fast){
                fast=head;
                while(slow!=fast){
                    slow=slow.next;
                    fast=fast.next;
                }
                return slow;  
            }
        }
        return null;
    }
}

相關文章