題目描述
給一個鏈表,若其中包含環,請找出該鏈表的環的入口結點,否則,輸出null。
解法
快慢指針法
若假設有環存在,則快慢指針會交匯
若此時初始化一個指針從頭結點出發,則這個指針與慢指針交匯的結點爲環入口結點
此結論可通過畫圖證明:
假設進入環前的路程爲r1,交匯點與入口的距離爲r2,餘下距離爲r3.
則慢指針路程爲r1 + r2
快指針路程爲r1 + k(r2 + r3) + r2
然而慢指針速度是快指針的1/2
因此化簡因式 2(r1 + r2) = r1 + k(r2 + r3) + r2
r1 = (k - 1)r2 + k*r3 (k<=1) 且 r2 + r3爲環總長度
所以r1 = r3
詳細代碼如下:
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public ListNode EntryNodeOfLoop(ListNode pHead)
{
ListNode n1 = pHead;//slow
ListNode n2 = pHead;//fast
ListNode n3 = pHead;//result
if(n1 == null||n1.next == null){
return null;
}
while(n1 != null){
n1 = n1.next;
n2 = n2.next.next;
if(n2 == n1){
while(n1 != n3){
n1 = n1.next;
n3 = n3.next;
}
return n3;
}
}
return null;
}
}