141.环形链表 & 142.环形链表II
141.环形链表
思路:快慢指针 or 哈希表
快慢指针代码:
class Solution {
public:
bool hasCycle(ListNode *head) {
if(head==nullptr||head->next==nullptr)
return false;
ListNode *fast=head->next; //不能设置成head,否则不进入while循环
ListNode *slow=head;
while(fast!=slow){
//如果无环fast在slow前面,只需要判断fast
if(fast->next!=nullptr&&fast->next->next!=nullptr){
fast=fast->next->next;
slow=slow->next;
}else{ //无环
return false;
}
}
return true;
}
};
哈希表代码:
class Solution {
public:
ListNode *detectCycle(ListNode *head) {
unordered_set<ListNode*> hash;
ListNode* cur=head;
while(cur!=nullptr){
//哈希表中出现过
if(hash.count(cur)){
return cur;
}
hash.insert(cur);
cur=cur->next;
}
return nullptr;
}
};
142.环形链表II
思路:快慢指针+数学推导 or 哈希表
哈希表同前,数学推导见下图,
代码:
class Solution {
public:
ListNode *detectCycle(ListNode *head) {
ListNode *slow = head, *fast = head;
while (fast != nullptr) {
slow = slow->next;
if (fast->next == nullptr) {
return nullptr;
}
fast = fast->next->next;
if (fast == slow) {
ListNode *ptr = head;
while (ptr != slow) {
ptr = ptr->next;
slow = slow->next;
}
return ptr;
}
}
return nullptr;
}
};