class Solution {
public:
ListNode *detectCycle(ListNode *head) {
ListNode* fast = head;
ListNode* slow = head;
while (slow && fast && fast->next) {
fast = fast->next->next;
slow = slow->next;
if (slow == fast) {
ListNode* cur = head;
while (cur && slow) {
// 这里一定要注意顺序, 先判断是不是相等,再往后移动,因为这个链表环的第一个节点就是入口点
if (cur == slow) {
return cur;
}
cur = cur->next;
slow = slow->next;
}
}
}
return nullptr;
}
};
code2- 直接while判断
class Solution {
public:
ListNode *detectCycle(ListNode *head) {
ListNode* fast = head;
ListNode* slow = head;
while (slow && fast && fast->next) {
fast = fast->next->next;
slow = slow->next;
if (slow == fast) {
ListNode* cur = head;
while (cur != slow) {
cur = cur->next;
slow = slow->next;
}
return cur;
}
}
return nullptr;
}
};