题目描述
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。
思路:
用快慢指针
起始点A, 快指针一次走2步,慢指针一次走1步,在C点重合。A->C的路径长度 == C->C的路径长度
环的入口结点B,肯定在AC之间。A->B的路径长度等于C->B的路径长度。(因为都减去B->C)
也就是说,用双指针指向A和C,同时1步移动,重合的节点就是入口结点。
ListNode* EntryNodeOfLoop(ListNode* pHead)
{
//用快慢指针
//起始点A, 快指针一次走2步,慢指针一次走1步,在C点重合。A->C的路径长度 == C->C的路径长度
//环的入口结点B,肯定在AC之间。A->B的路径长度等于C->B的路径长度。(因为都减去B->C)
//也就是说,用双指针指向A和C,同时1步移动,重合的节点就是入口结点。
ListNode* fast = pHead;
ListNode* low = pHead;
while(fast && fast->next) //注意有可能没有环
{
fast = fast->next->next;
low = low->next;
if(fast == low)
{
break;
}
}
if(!fast || !(fast->next))return nullptr;
fast = pHead;
while(fast!=low)
{
fast = fast->next;
low = low->next;
}
return fast;
}