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;
}
}