1、双循环遍历,空间o(1) 时间o(n2)
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(nullptr) {}
};
class Solution {
public:
bool hasCycle(ListNode *head) {
ListNode* phead_i=head;
while(phead_i!=nullptr)
{
ListNode* phead_j=head;
while(phead_j!=nullptr && phead_j->next!=nullptr)
{
if(phead_j==phead_i) return true;
phead_j=phead_j->next;
}
phead_i=phead_i->next;
}
return false;
}
};
2、hash保存,空间o(n) 时间o(n)
struct ListNode{
int val;
ListNode* next;
ListNode(int x):val(x),next(nullptr){}
}
class Solution {
public:
bool hasCycle(ListNode *head) {
unordered_set<ListNode*> st;
ListNode* phead=head;
while(phead!=nullptr)
{
if(st.count(phead)==1)
return true;
st.insert(phead);
phead=phead->next;
}
return false;
}
};
3、快慢指针,空间o(1) 时间o(n)
struct ListNode{
int val;
LIstNode* next;
ListNode(int x):val(x),next(nullptr){}
};
class Solution {
public:
bool hasCycle(ListNode *head) {
ListNode* low_node=head;
ListNode* fast_node=head;
while(fast_node!=nullptr && fast_node->next!=nullptr)
{
low_node=low_node->next;
fast_node=fast_node->next->next;
if(low_node==fast_node) return true;
}
return false;
}
};