题解 | #判断链表中是否有环#
判断链表中是否有环
https://www.nowcoder.com/practice/650474f313294468a4ded3ce0f7898b9
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: //采用快慢指针: //假设:起点到环入口点的距离是a,环入口点到快慢指针相遇点的距离是b,相遇点到环入口点的距离是c //相遇时,快指针走a+b+m(b+c) 慢指针走a+b+n(b+c) //满足2[a+b+m(b+c)]=a+b+n(b+c) 化简得到a+b=(n-2m)(b+c) 即a+b=k(b+c) //可以得到a=(k-1)(b+c)+c 即a=nL+c bool hasCycle(ListNode* head) { if (head == nullptr || head->next == nullptr || head->next->next == nullptr) return false; ListNode* fast = head; ListNode* slow = head; //让快慢指针相遇 do { fast = fast->next; if (fast) { fast = fast->next; } else { return false; } slow = slow->next; } while (fast && slow && fast != slow); if (fast == nullptr || slow == nullptr) return false; //让慢指针回到起点,满足a=nL+c,快慢指针同时走到环入口点 slow = head; while (fast != slow) { fast = fast->next; slow = slow->next; } if (fast == slow) return true; else return false; } };