题目描述
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。
思路
设置两个指针,一个快指针(走两步),一个慢指针(走一步)。如果能相遇则说明有环。
判断有环后如果找到入口结点:让慢指针回到头结点,两个指针同时走(都走一步),相等时即为入口结点。
代码
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
*/
class Solution {
public:
ListNode* EntryNodeOfLoop(ListNode* pHead)
{
if (!pHead) return nullptr;
auto quick = pHead, slow = pHead;
while (slow->next && quick->next->next){
slow = slow->next;
quick = quick->next->next;
if (slow == quick){
slow = pHead;
while (slow != quick){
slow = slow->next;
quick = quick->next;
}
return slow;
}
}
return nullptr;
}
};