题目描述:给定一个链表的头节点  head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。

方法1:使用unordered_set

class Solution {
public:
    ListNode *detectCycle(ListNode *head) {
        unordered_set<ListNode*> set;
        while(head){
            if(set.count(head)) return head;
            set.emplace(head);
            head = head->next;
        }
        return NULL;
    }
};

方法2:慢指针每次移动一步,快指针每次移动两步,如果有环最后一定会相遇

设快指针走n圈,慢指针走t圈

相遇后,将快指针指向头指针,快慢指针每次同时走一步,再相遇即为入环的第一个节点

class Solution {
public:
    ListNode *detectCycle(ListNode *head) {
        if(!head || !head->next) return NULL;
        ListNode *p = head;
        ListNode *q = head;
        while(q && q->next){
            p = p->next;
            q = q->next->next;
            if(p == q){
                q = head;
                while(p != q){
                    p = p->next;
                    q = q->next;
                }
                return p;
            }
        }
        return NULL;
    }
};