题目描述
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。
解题
- 快慢指针,fast走两步,slow走一步,当他们相遇时,fast走了一圈环,设环为n个节点,此时slow走的节点为x,则fast走x+n=2x,则有x=n。此时再令一个节点等于pHead和slow一起一次走一步,当他们相遇时,他们的节点为环的入口。
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
*/
class Solution {
public:
ListNode* EntryNodeOfLoop(ListNode* pHead)
{
if(pHead==NULL) return NULL;
ListNode* fast=pHead;
ListNode* slow=pHead;
ListNode* res=pHead;
int len=0;
int flg=0;
while(fast->next != NULL){
fast=fast->next;
if(slow->next != NULL) slow=slow->next;
if(fast->next != NULL) fast=fast->next;
if(fast->val==slow->val) flg++;
if(flg==1){
if(res->val==slow->val) break;
res=res->next;
}
}
if(flg==0) return NULL; // 没有环
return res;
}
};