利用题141的代码,当快慢指针相遇时,将其中一个指针的位置重置为链表头,另一个指针的位置不变,可以证明,(链表头到入环点的距离)=(快慢指针相遇点到入环点的距离+整数个环的长度),基于此,使得接下来两个指针在每次迭代中后移一步,它们的再次相遇点就是入环点。
令链表头到入环点的距离为x1,入环点到相遇点的距离为x2,相遇点到入环点的距离为x3,有:
2(x1+x2)=x1+x2+k(x2+x3)
-> x1+x2=k(x2+x3)
-> x1=(k-1)(x2+x3)+x3 前提得证
ListNode* detectCycle(ListNode *head)
{
auto p_Slow = head, p_Fast = head;
auto p_Note = p_Fast;
while (p_Fast != nullptr&&p_Fast->next != nullptr)
{
p_Fast = p_Fast->next->next;
p_Slow = p_Slow->next;
if (p_Slow == p_Fast)
{
p_Slow = head;
while (1)
{
if (p_Slow == p_Fast)
{
return p_Slow;
}
p_Slow = p_Slow->next;
p_Fast = p_Fast->next;
}
}
}
return nullptr;
}