LeetCode142. Linked List Cycle||(環形連結串列)——— 判斷連結串列是否有環以及求其入環節點
阿新 • • 發佈:2019-01-31
struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(nullptr) {} }; //判斷連結串列是否有環 //方法: //1、空間複雜度n:使用set集合儲存每一個節點,判斷是否有重複 //2、空間複雜度1:使用兩個指標,快指標走兩步,慢指標走一步; // 若快指標為null則無環。 // 若快指標與慢指標相遇,快指標回到開頭與慢指標一起每次只走一步,直至相遇為入環節點。 class Solution { public: ListNode * detectCycle(ListNode *head) { if (head == nullptr || head->next == nullptr)return nullptr; ListNode *fastp = head, *slowp = head; while (true) { if (fastp->next == nullptr || fastp->next->next == nullptr)return nullptr;//快指標為null則無環 + 防止訪問到空指標 fastp = fastp->next->next; slowp = slowp->next; if (slowp == fastp)break;//快指標與慢指標相遇,則有環 } fastp = head; while (fastp != slowp) { fastp = fastp->next; slowp = slowp->next; } return slowp; } };