方法一:哈希表(判断是否有重复元素)
此问题中重复元素指链表元素的地址
class Solution {
public:
bool hasCycle(ListNode *head) {
unordered_set<ListNode*> seen;
while(head){
if(seen.count(head))
return true;
seen.insert(head);
head=head->next;
}
return false;
}
};
方法二:龟兔赛跑
若快指针能够将慢指针套圈,说明有环,若快指针跑到尽头,说明无环
只要快慢指针步长互质,则有环情况下快指针总能和慢指针相遇
class Solution {
public:
bool hasCycle(ListNode *head) {
if(!head)
return false;
ListNode*slow=head;
ListNode*fast=head->next;
while(fast&&slow){
if(fast==slow)
return true;
slow=slow->next;
if(!fast->next)
return false;
fast=fast->next->next;
}
return false;
}
};