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.
}
相关推荐
彧azz22 分钟前
Java学习记录:判断语句
java·笔记·学习·算法
alphaTao26 分钟前
LeetCode 每日一题 2026/9/14-2026/9/20
算法·leetcode
hanlin0327 分钟前
刷题笔记:力扣第560题-和为k的子数组
笔记·算法·leetcode
residual_fan43 分钟前
航空发动机故障诊断专用智能体(四):深度强化学习与自适应奖励机制
人工智能·算法·数据挖掘·数据分析
2601_962218611 小时前
万象生鲜系统多终端统一数据协议PC手机PDA数据实时同步
大数据·数据库·人工智能·python·算法
AgentMaster1 小时前
企业元数据管理技术实战:从采集架构到血缘解析的完整方案
大数据·人工智能·算法
晴天的雨.9921 小时前
[C++算法]盛最多水的容器(双指针算法)
开发语言·c++·算法
布莱克6051 小时前
理解内存泄漏:成因、发现方法与解决策略(C++ 举例)
c语言·c++·内存泄漏
Logic1012 小时前
C语言/数据结构位运算题解:异或XOR找出英雄升级系统中的“独特经验值“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
不会就选b2 小时前
算法日常・每日刷题--<贪心>15
算法