题目描述
一个链表中包含环,请找出该链表的环的入口结点。
思路
1、设置一对快慢指针,都从链表头出发(快指针每次走两步,慢指针每次一步)
2、找到两个指针在环上的相遇点
3、设置两个指针,分别从链表头和相遇点出发
4、上面两个指针相遇的地方即为环入口
ListNode* EntryNodeOfLoop(ListNode* pHead)
{
if(pHead == NULL || pHead->next == NULL)
{
return NULL;
}
//快慢指针都从头开始,这样可以保证只有环的情况下,快慢指针是在head节点相遇的
ListNode *p1 = pHead;
ListNode *p2 = pHead;
//找到环上相遇的节点
while( p1 != NULL && p1->next != NULL)
{
p1 = p1->next->next;
p2 = p2->next;
if(p1 == p2)
{
p2 = pHead;
//如果p1==p2==pHead,说明链表只有环
while(p1 != p2)
{
p1 = p1->next;
p2 = p2->next;
}
return p1;
}
}
return NULL;
}