剑指Offer55 链表环入口(链表多指针遍历)
2019-01-21 本文已影响1人
北国雪WRG
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出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;
}