/* 快慢指针查找链表是否有环 fast 每次走两步 low 走一步 当两个指针相遇时,fast 比 low 多走一倍 然后 fast 从头开始走 a 为链表头到链表环结点的距离, b 为 环入口到相遇点距离 c 为 相遇点到环入口的距离 则 low 走了 a+b fast 走了 a + (b+c)*k(圈数) + b = (a + b) * 2 a+b = (b+c)*k 即:链表头到环入口的距离 = 相遇点到 环入口的距离 + (k-1)圈的长度 */ class Solution { public: ListNode* EntryNodeOfLoop(ListNode* pHead) { ListNode *fast = pHead; ListNode *slow = pHead; while (fast && fast->next) { fast = fast->next->next; slow = slow->next; if (fast == slow) break; } if (!fast || !fast->next) return nullptr; fast = pHead; // while (fast != slow) { fast = fast->next; slow = slow->next; } return fast; } };