LeetCode:環形鏈表2

https://leetcode-cn.com/problems/linked-list-cycle-ii/

先判斷是否有環,然後再找環內第一個節點。

解題思路:分兩個步驟,首先通過快慢指針的方法判斷鏈表是否有環;接下來如果有環,則尋找入環的第一個節點。具體的方法爲,首先假定鏈表起點到入環的第一個節點A的長度爲a【未知】,到快慢指針相遇的節點B的長度爲(a + b)【這個長度是已知的】。現在我們想知道a的值,注意到快指針p2始終是慢指針p走過長度的2倍,所以慢指針p從B繼續走(a + b)又能回到B點,如果只走a個長度就能回到節點A。但是a的值是不知道的,解決思路是曲線救國,注意到起點到A的長度是a,那麼可以用一個從起點開始的新指針q和從節點B開始的慢指針p同步走,相遇的地方必然是入環的第一個節點A。
借鑑了該用戶的思路

public class Solution {
    public ListNode detectCycle(ListNode head) {
        if(head == null) return null;
        ListNode p1 = head,p2 = head;
        boolean hasCycle = false;
        while(p2.next != null && p2.next.next != null) {
            p1 = p1.next;
            p2 = p2.next.next;
            if(p1 == p2) {
                hasCycle = true;
                break;
            }
        }
        if(hasCycle) {
            ListNode q1 = head;
            while(q1 != p1) {
                q1 = q1.next;
                p1 = p1.next;
            }
            return q1;
        }
        return null;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章