给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。
带有环的链表.png
- 设置两个指针,快指针每次走两步,慢指针每次走一步
- 两个指针同时走,直到相遇
- 记录相遇点为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;
}
本文介绍了一种高效算法,用于在链表中找到环的入口节点,如果链表存在环。通过使用快慢指针策略,算法首先确定环的存在,然后精确定位环的起始位置。
570

被折叠的 条评论
为什么被折叠?



