给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。
先找到环的节点数:一块一慢两个指针,快的追上慢的指针时,该指针指向的结点在环内,遍历一次环拿到节点数K,再用两个相距K的指针遍历一次链表,可找到入口结点。
/*
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;
if(pHead->next == NULL) return NULL;
ListNode *fast = pHead->next;
ListNode *low = pHead;
while(fast != low ) {
if(fast->next == NULL || fast->next->next == NULL) return NULL;
fast = fast->next->next;
low = low->next;
}
fast = fast->next;
int count = 1;
while(fast != low){
fast = fast->next;
count++;
}
ListNode *res = pHead;
while(count--){
res = res->next;
}
while(pHead != res) {
pHead = pHead->next;
res = res->next;
}
return res;
}
};