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:
c 复制代码
/**
 * 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.
}
相关推荐
HappyAcmen2 小时前
机器算法之逻辑回归(Logistic Regression)详解
算法·机器学习·逻辑回归
get_money_2 小时前
代码随想录Day37 动态规划:完全背包理论基础,518.零钱兑换II,本周小结动态规划,377. 组合总和 Ⅳ,70. 爬楼梯(进阶版)。
java·笔记·算法·动态规划
get_money_2 小时前
代码随想录38 322. 零钱兑换,279.完全平方数,本周小结动态规划,139.单词拆分,动态规划:关于多重背包,你该了解这些!背包问题总结篇。
java·开发语言·笔记·算法·动态规划
jackiendsc4 小时前
雪花算法(Snowflake algorithm)介绍、优缺点及代码示例
算法·html·dreamweaver
Kai HVZ6 小时前
《机器学习》——KNN算法
人工智能·算法·机器学习
骑着王八撵玉兔6 小时前
【集合】——LinkedList
java·数据结构·算法
密码突破手8 小时前
pyca/cryptography库的学习(7)——python
网络·python·算法·安全·密码学
柒月的猫9 小时前
油漆面积(2017年蓝桥杯)
算法·职场和发展·蓝桥杯
2301_793086879 小时前
算法排序算法
数据结构·算法·排序算法
WeeJot嵌入式9 小时前
C语言----词法符号
c语言·数据结构·算法