题目描述:
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,返回null。
解题分析:
- 初始化:快指针fast指向头结点, 慢指针slow指向头结点
- 让fast一次走两步, slow一次走一步,第一次相遇在C处,停止
- 然后让fast指向头结点,slow原地不动,然后后fast,slow每次走一步,当再次相遇,就是入口结点。
可参考:https://blog.nowcoder.net/n/9d3ffa4b004e43d1aff512141d0d7dac
/*
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* slowPtr=pHead;
ListNode* fastPtr=pHead;
bool hasLoop = false;
while(fastPtr!=NULL && fastPtr->next!=NULL){
fastPtr=fastPtr->next->next;
slowPtr=slowPtr->next;
if(slowPtr==fastPtr){
hasLoop=true;
break;
}
}
if(!hasLoop){
return NULL;
}
fastPtr=pHead;
while (fastPtr != slowPtr) {
fastPtr = fastPtr->next;
slowPtr = slowPtr->next;
}
return fastPtr;
}
};