给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。

    为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意,pos 仅仅是用于标识环的情况,并不会作为参数传递到函数中。

    说明:不允许修改给定的链表。

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/linked-list-cycle-ii

    思路:
    1、快慢指针

    1. class Solution {
    2. public:
    3. ListNode *detectCycle(ListNode *head) {
    4. if (head == nullptr || head->next == nullptr) {
    5. return nullptr;
    6. }
    7. ListNode* fast = head;
    8. ListNode* slow = head;
    9. while (fast != nullptr) {
    10. slow = slow->next;
    11. // 这步很重要:当链表无环时,fast->next会为空
    12. if (fast->next == nullptr) {
    13. return nullptr;
    14. }
    15. fast = fast->next->next;
    16. if (slow == fast) {
    17. ListNode* firstMeetNode = head;
    18. while (firstMeetNode != slow) {
    19. firstMeetNode = firstMeetNode->next;
    20. slow = slow->next;
    21. }
    22. return firstMeetNode;
    23. }
    24. }
    25. return nullptr;
    26. }
    27. };

    TIPS:
    快慢指针相遇时,满足:distance[snow, 首个交点] = distance[head, 首个交点]

    2、HashTable
    std::Set nodes;
    cur = head;
    while (cur != nullptr) {
    if (nodes.find(cur) == nodes.end()) {
    return cur;
    }
    cur = cur->next;
    }

    return nullptr;