1. 程式人生 > >[劍指offer] 連結串列中環的入口結點

[劍指offer] 連結串列中環的入口結點

本文首發於我的個人部落格:尾尾部落

題目描述

給一個連結串列,若其中包含環,請找出該連結串列的環的入口結點,否則,輸出null。

解題思路

第一步,用兩個快慢指標找環中相匯點。分別用slow, fast指向連結串列頭部,slow每次走一步,fast每次走二步,直到fast == slow找到在環中的相匯點。
第二步,找環的入口。當fast == slow時,假設slow走過x個節點,則fast走過2x個節點。設環中有n個節點,因為fastslow多走一圈(n個節點),所以有等式2x = n + x,可以推出n = x,即slow實際上走了一個環的步數。這時,我們讓fast

重新指向連結串列頭部pHeadslow的位置不變,然後slowfast一起向前每次走一步,直到fast == slow,此時兩個指標相遇的節點就是環的入口。

參考程式碼

/*
 public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}
*/
public class Solution {
    public ListNode EntryNodeOfLoop(ListNode pHead)
    {
        if
(pHead.next == null || pHead.next.next == null) return null; ListNode slow = pHead.next; ListNode fast = pHead.next.next; while(fast != null){ if(fast == slow){ fast = pHead; while(fast != slow){ fast = fast.next; slow = slow.next; } return
fast; } slow = slow.next; fast = fast.next.next; } return null; } }