解題思路
hashmap法
思路簡單,時間複雜度O(n),空間複雜度O(n)
Floyd法
知道結論進行編程容易,但是自己推導出Floyd公式比較難,理解該方法,進行編程即可
時間複雜度O(n),空間複雜度O(1)
代碼
hashmap法
class Solution {
public:
ListNode* detectCycle(ListNode* head) {
if (head == nullptr || head->next == nullptr) return nullptr;
unordered_map<ListNode*, int> nodeMap;
ListNode* cur = head;
while (cur)
{
if (nodeMap.find(cur) != nodeMap.end()) return cur;
nodeMap[cur]++;
cur = cur->next;
}
return nullptr;
}
};
Floyd法
class Solution {
public:
ListNode* detectCycle(ListNode* head) {
//特判
//排除空節點或單個節點不成環的情況
if (head == nullptr || head->next == nullptr) return nullptr;
ListNode* slow, * fast;
slow = head;//slow和fast要從head同時出發,要不然根據Floyd的原理進行指針移動會發生死循環
fast = head;
while (fast && fast->next)
{
slow = slow->next;
fast = fast->next->next;
if (fast==slow)//存在環
{
fast = head;//fast重置爲head,slow不變,然後fast和slow現在開始每次只走一步,相遇點就是環的入口
while (fast!=slow)
{
fast = fast->next;
slow = slow->next;
}
return fast;
}
}
return nullptr;
}
};