hashmap O(n), 快慢指针O(1)
class Solution {
public:
bool hasCycle(ListNode *head) {
if(head==NULL) return false;
ListNode* fast = head, *slow = head;
while(fast&&fast->next){
fast = fast->next->next;
slow = slow->next;
if(fast==slow) return true;
}
return false;
}
};
假设相遇点在C轴,把时间回退,当慢指针回退到B点,快指针回退到C点的对称点C'
此时,慢指针已经从a走到b,走了x,快指针从a点从到C'点,走了2x,说明b到C'的距离恰好是x,由对称性,C到B的距离也是x
class Solution {
public:
ListNode *detectCycle(ListNode *head) {
if(head==NULL) return NULL;
ListNode* fast = head, *slow = head;
while(fast&&fast->next){
fast = fast->next->next;
slow = slow->next;
if(fast==slow) {
slow = head;
while(fast!=slow){
slow = slow->next;
fast = fast->next;
}
return slow;
}
}
return NULL;
}
};