• LeetCode //C - 142. Linked List Cycle II


    142. Linked List Cycle II

    Given the head of a linked list, return the node where the cycle begins. If there is no cycle, return null.

    There is a cycle in a linked list if there is some node in the list that can be reached again by continuously following the next pointer. Internally, pos is used to denote the index of the node that tail’s next pointer is connected to (0-indexed). It is -1 if there is no cycle. Note that pos is not passed as a parameter.

    Do not modify the linked list.
     

    Example 1:

    在这里插入图片描述

    Input: head = [3,2,0,-4], pos = 1
    Output: tail connects to node index 1
    Explanation: There is a cycle in the linked list, where tail connects to the second node.

    Example 2:

    在这里插入图片描述

    Input: head = [1,2], pos = 0
    Output: tail connects to node index 0
    Explanation: There is a cycle in the linked list, where tail connects to the first node.

    Example 3:

    在这里插入图片描述

    Input: head = [1], pos = -1
    Output: no cycle
    Explanation: There is no cycle in the linked list.

    Constraints:
    • he number of the nodes in the list is in the range [ 0 , 1 0 4 ] [0, 10^4] [0,104].
    • − 1 0 5 < = N o d e . v a l < = 1 0 5 -10^5 <= Node.val <= 10^5 105<=Node.val<=105
    • pos is -1 or a valid index in the linked-list.

    From: LeetCode
    Link: 142. Linked List Cycle II


    Solution:

    Ideas:
    1. Initialization: Start with two pointers at the head of the linked list, slow and fast.

    2. Movement: Move slow by one node and fast by two nodes at each step. The slow pointer moves one step at a time (slow = slow->next;), while the fast pointer moves two steps at a time (fast = fast->next->next;).

    3. Cycle Detection: If there is a cycle, the fast pointer will eventually overlap with the slow pointer inside the cycle since the fast pointer is moving faster. If the fast pointer reaches NULL (i.e., fast == NULL || fast->next == NULL), that means the list has an end and, therefore, no cycle.

    4. Identifying Cycle Entry: Once a cycle is detected (i.e., slow == fast), move the slow pointer back to the head of the list and keep the fast pointer at the meeting point. Now move both pointers at the same pace, one step at a time (slow = slow->next; fast = fast->next;).

    5. Cycle Entry Point: The point where the slow and fast pointers meet again is the start of the cycle. This happens because the distance from the head of the list to the start of the cycle is the same as the distance from the meeting point to the start of the cycle following the cycle’s path.

    Code:
    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     struct ListNode *next;
     * };
     */
    struct ListNode *detectCycle(struct ListNode *head) {
        struct ListNode *slow = head;
        struct ListNode *fast = head;
        
        // First step: Determine whether there is a cycle in the list.
        while (fast != NULL && fast->next != NULL) {
            slow = slow->next;
            fast = fast->next->next;
            
            if (slow == fast) {
                // Cycle detected, now let's find the entry point.
                slow = head; // Move slow pointer to head.
                while (slow != fast) {
                    slow = slow->next;
                    fast = fast->next;
                }
                return slow; // slow is now the start of the cycle.
            }
        }
        return NULL; // No cycle found.
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
  • 相关阅读:
    【最新】TensorFlow、cuDNN、CUDA三者之间的最新版本对应及下载地址
    什么是列式存储和行式存储
    HCNP Routing&Switching之ARP安全
    【无标题】
    linux的内存管理
    逻辑判断与正则表达式文本处理
    java Flink(四十一)Flink+avro+广播流broadcast实现流量的清洗
    CSDN每日一练 |『相似三角形』『 运输石油』『鬼画符门之宗门大比』2023-09-13
    一种高精度低功耗NB-IoT温度传感器
    了解Zookeeper总结知识点
  • 原文地址:https://blog.csdn.net/navicheung/article/details/136613359