带环链表求链表环入口节点

1:快慢指针法判断是否带环
快指针一次走两步,慢指针一次走一步(pFast=pFast->next->next,pSlow=pSlow->next)若相遇则说明带环,就好像两人在操场同一位置开始跑圈,只要两人速度不同总会在操场某一处相遇,若不相遇则说明跑的不是圈,俩人差距越来越大即链变无环。
2:找入口节点
标记相遇点,重新开始走,一个指针指向头节点,另一节点指向相遇节点,两指针速度相同,相遇点即入口节点。
自己画图更有助于理解,具体原因参考如下:
参考http://kekecv.com/2016/06/08/Linked-List-Cycle-%E5%88%A4%E6%96%AD%E9%93%BE%E8%A1%A8%E6%98%AF%E5%90%A6%E6%9C%89%E7%8E%AF%EF%BC%8C%E5%A6%82%E6%9E%9C%E6%9C%89%E7%8E%AF%EF%BC%8C%E6%89%BE%E5%88%B0%E7%8E%AF%E7%9A%84%E5%85%A5%E5%8F%A3/

带环链表求链表环入口节点

class Solution {
public:
ListNode* EntryNodeOfLoop(ListNode* pHead)
{
if(pHeadNULL||pHead->nextNULL)
{
return NULL;
}
ListNode* pFast=pHead;
ListNode* pSlow=pHead;
while(pFast->next!=NULL&&pFast->next->next!=NULL)
{
pFast=pFast->next->next;
pSlow=pSlow->next;
if(pFast==pSlow)
{
pFast=pHead;
while(pFast!=pSlow)
{
pFast=pFast->next;
pSlow=pSlow->next;
}
return pFast;
}
}
return NULL;
}
};