原理还是要好好看看

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
        val(x), next(NULL) {
    }
};
*/
class Solution {
  public:
    ListNode* EntryNodeOfLoop(ListNode* pHead) {
      ListNode *res = nullptr;
      if (res = if_loop(pHead)) {
        ListNode *tmp = pHead;
        while (tmp != res) {
          tmp = tmp->next;
          res = res->next;
        }
      }
      return res;
    }
  private:
    ListNode* if_loop(ListNode *head) {
      ListNode *fast = head, *slow = head;
      
      while (fast && fast->next) {
        fast = fast->next->next;
        slow = slow->next;
        if (fast == slow) return fast;
      }
      return nullptr;
    }
};