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. H12-821_182

    2024-03-14 12:58:03       41 阅读
  2. LeetCode[141] [142] 环形链表I II

    2024-03-14 12:58:03       68 阅读
  3. IOS面试题object-c 149-152

    2024-03-14 12:58:03       33 阅读
  4. lc142.环形链表Ⅱ

    2024-03-14 12:58:03       63 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-14 12:58:03       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-14 12:58:03       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-14 12:58:03       87 阅读
  4. Python语言-面向对象

    2024-03-14 12:58:03       97 阅读

热门阅读

  1. MyBatis-Plus IgnoreStrategy:深入解析与策略应用

    2024-03-14 12:58:03       41 阅读
  2. ES6基础1

    2024-03-14 12:58:03       38 阅读
  3. 单元测试框架unittest D16

    2024-03-14 12:58:03       40 阅读
  4. 聊聊js数据结构

    2024-03-14 12:58:03       35 阅读
  5. Docker之自定义镜像上传阿里云

    2024-03-14 12:58:03       38 阅读
  6. 蓝桥杯2023年-岛屿个数(dfs,染色法)

    2024-03-14 12:58:03       38 阅读
  7. Python | Class生成器

    2024-03-14 12:58:03       34 阅读
  8. 贪心算法概念

    2024-03-14 12:58:03       40 阅读
  9. 数据挖掘案列分析---LightGBM实战贷款违约预测

    2024-03-14 12:58:03       35 阅读
  10. Docker基础—CentOS中卸载Docker

    2024-03-14 12:58:03       35 阅读
  11. Linux下platform驱动简介

    2024-03-14 12:58:03       42 阅读