图解很清晰,
第一次相遇时,快指针走了2k步,慢指针走了k步。
那么第一次相遇点离入口t步,头节点到入口节点也是t步。
得解。
//参考文章
//https://blog.csdn.net/weixin_41888257/article/details/103926828
//修改的是,x=d+(k-1)s,可见,当k=1时,意味着两个指针第一次相遇,此时x=d,意味着,重置其中一个指针到起点,
//当再次相遇,便可求出结果。
class Solution {
public:
ListNode* EntryNodeOfLoop(ListNode* pHead)
{
if(!pHead||!pHead->next) return NULL;
ListNode * p1;
ListNode * p2;
p1 = pHead;
p2 = pHead;
while(p2!=NULL && p2->next!=NULL)
{
p1 =p1->next;
p2 =p2->next->next;
if(p1==p2)
break;
}
p2 = pHead;
while(p2!=p1)
{
p1 = p1->next;
p2 = p2->next;
}
return p2;
}
};