基本思路:用快慢指针可以确定环的长度a+b,a为入环之前的长度,b为环里走的长度,再用一个指针从头和慢指针一块走,相遇的位置就是入环节点
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
class Solution {
public:
ListNode *detectCycle(ListNode *head) {
if (head == NULL)
return NULL;
ListNode *slow = head, *fast = head;
int hasCycle = 0;
while (fast == NULL && fast->next == NULL){
slow = slow->next;
fast = fast->next->next;
if (slow == fast){
hasCycle = 1;
break;
}
}
if (hasCycle){
ListNode *p = head;
while (p != slow){
p = p->next;
slow = slow->next;
}
return p;
}
else
return NULL;
}
};