/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
        val(x), next(NULL) {
    }
};
*/
#include <unordered_map>
class Solution {
  public:
    bool hasCycle(ListNode* head) {

        if (head == nullptr)
            return false;
        ListNode* fast = head;
        ListNode* slow = head;
        while (fast->next && fast) {
            if (fast->next)
                slow = slow->next;
            fast = fast->next->next;
            if (fast == slow)
                return true;
        }
        return false;
    }

    ListNode* EntryNodeOfLoop(ListNode* pHead) {
        if(!hasCycle(pHead))
        return nullptr;
        unordered_map<ListNode*, int> mp;
        while(1)
        {
            mp[pHead]++;
            pHead=pHead->next;
            for(auto& pair:mp)
            {
                if(pair.second==2)
                return pair.first;
            }
        }
    }
};