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.
}
相关推荐
Dr.92727 分钟前
1-10 目录树
java·数据结构·算法
双叶83630 分钟前
(C语言)超市管理系统 (正式版)(指针)(数据结构)(清屏操作)(文件读写)(网页版预告)(html)(js)(json)
c语言·javascript·数据结构·html·json
子豪-中国机器人39 分钟前
C++ 蓝桥 STEMA 省选拔赛模拟测试题(第一套)
开发语言·c++·算法
callJJ41 分钟前
Bellman - Ford 算法与 SPFA 算法求解最短路径问题 ——从零开始的图论讲解(4)
数据结构·算法·蓝桥杯·图论·单源最短路径·bellman- ford算法
圈圈编码44 分钟前
LeetCode Hot100刷题——轮转数组
java·算法·leetcode·职场和发展
金融小师妹5 小时前
应用BERT-GCN跨模态情绪分析:贸易缓和与金价波动的AI归因
大数据·人工智能·算法
广州智造5 小时前
OptiStruct实例:3D实体转子分析
数据库·人工智能·算法·机器学习·数学建模·3d·性能优化
belldeep6 小时前
如何阅读、学习 Tcc (Tiny C Compiler) 源代码?如何解析 Tcc 源代码?
c语言·开发语言
Trent19857 小时前
影楼精修-肤色统一算法解析
图像处理·人工智能·算法·计算机视觉
feifeigo1237 小时前
高光谱遥感图像处理之数据分类的fcm算法
图像处理·算法·分类