給一個鏈表,若其中包含環,請找出該鏈表的環的入口結點,否則,輸出null。
- 設置兩個指針,快指針每次走兩步,慢指針每次走一步
- 兩個指針同時走,直到相遇
- 記錄相遇點爲B
- 設置兩個指針,一個從A出發,一個從B出發,必定在C相遇!
爲啥呢????
- 當在B相遇的時候,快指針比慢指針多走了
N個環
- 快指針還差
BC
長度就走了AC + M個環
- 所以
BC = AC + S個環
- 從A和B同時出發的兩個速度相同的指針點顯然在C(仔細琢磨爲啥)
public ListNode EntryNodeOfLoop(ListNode pHead)
{
if(pHead==null||pHead.next==null)return null;
ListNode p1=pHead;
ListNode p2=pHead;
while(p2!=null&&p2.next!=null)
{
p1=p1.next;
p2=p2.next.next;
if(p1==p2)
{
p1=pHead;
while(p1!=p2)
{
p1=p1.next;
p2=p2.next;
}
if(p1==p2)return p1;
}
}
return null;
}