• 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
  • 相关阅读:
    什么是Redis的数据分片?
    E5061B/是德科技keysight E5061B网络分析仪
    金仓数据库KingbaseES备份与恢复工具手册(备份)
    深入浅出WMS之入库流程解析
    大健康行业千城万企信用建设工作启动大会在京召开
    javaWeb项目-房屋房租租赁系统功能介绍
    P1455 搭配购买(01背包&并查集)
    JDK API文档地址(中文和英文)
    如何在Visual Studio Code中禁用Less文件保存时自动编译为CSS的功能
    SpringBoot中静态变量注入方案,一网打尽
  • 原文地址:https://blog.csdn.net/navicheung/article/details/136613359