题目描述
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。
解析: (1) 找环中相汇点。分别用p1,p2指向链表头部,慢指针p1每次走一步,快指针p2每次走二步,直到p1==p2找到在环中的相汇点。注意慢指针赋值为头结点的下一节点,快指针赋值为头结点的下第二个节点,否则错误!(2) 第二步,找环的入口。接上步,当p1==p2时,再让快指针p2指向链表头部,p1位置不变,p1,p2每次走一步直到p1==p2; 此时p1指向环的入口。注意此时快慢指针每次只走一步!!!
更详细可以看我另一篇博客:https://blog.youkuaiyun.com/qq_29762941/article/details/81192184
代码如下:
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
*/
class Solution {
public:
ListNode* hasCircle(ListNode* pHead)
{
if(pHead==nullptr || pHead->next==nullptr)
return nullptr;
ListNode *p1,*p2;
p1 = pHead->next;//注意是pHead的下一个节点
p2 = pHead->next->next;//注意是pHead的下两节点
while(p1!=nullptr && p2!=nullptr){
if(p1==p2)
return p1;
p1=p1->next;
if(p2->next == nullptr)
return nullptr;
p2=p2->next->next;
}
return nullptr;
}
ListNode* EntryNodeOfLoop(ListNode* pHead)
{
if(pHead==nullptr || pHead->next==nullptr)
return nullptr;
ListNode* p1 = hasCircle(pHead),*p2 = pHead;
if(p1 == nullptr)
return nullptr;
while(p1 != p2){
p1 = p1->next;
p2 = p2->next;
}
return p1;
}
};