/* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } }; */ class Solution { public: ListNode* EntryNodeOfLoop(ListNode* pHead) { if(pHead==nullptr) { return nullptr; } // 仍然用快慢指针 ListNode* slow = pHead; ListNode* fast = pHead; //还不一定有环 所以像BM6那样再来判断 while(fast!=nullptr && fast->next!=nullptr) { fast = fast->next->next; slow = slow->next; if(fast == slow) { break; } } if(fast==nullptr || fast->next==nullptr) { return nullptr; //无环 就返回空 } slow = pHead; // 再让他回到头结点 fast此时在环中某位置 // 为啥继续遍历 相遇的时候就是入口? // 证明 https://zhuanlan.zhihu.com/p/103626709 while(fast!=slow) { fast = fast->next; slow = slow->next; } return slow; } };
BM6的扩展 知乎链接里有证明