zoukankan      html  css  js  c++  java
  • LeetCode 142. Linked List Cycle II

    142. Linked List Cycle II

    Given a linked list, return the node where the cycle begins. If there is no cycle, return null.

    To represent a cycle in the given linked list, we use an integer pos which represents the position (0-indexed) in the linked list where tail connects to. If pos is -1, then there is no cycle in the linked list.

    Note: 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.
    

    第一步:

    1. 设置一个慢指针,一次走一步

    2. 设置一个快指针,一次走两步

    3. 如果慢指针和快指针都指向同一个地址,则表明为这是一个环。

    4. 否则,无环

    第二步:

    1. L1:头结点和入口结点之间的距离

    2. L2:入口结点和相遇结点之间的距离

    3. C:环的长度

    4. n:快指针绕环一周的次数(当第一次,快慢指针相遇)

    ===> 1. 当相遇,慢指针经过的总距离:L1+L2

    ===> 2. 当相遇,快指针经过的总距离:L1+L2 + n*C

    ===> 头部位置和入口位置之间的距离=相遇位置(fast)和入口位置(entry)向前移动之间的距离。

    class Solution 
    { 
    public:
        ListNode *detectCycle(ListNode *head)
        {
            if (head == NULL || head->next == NULL) return NULL;
            
            ListNode *slow = head;  
            ListNode *fast = head;  
            bool isCycle = false;   
    
            while (slow != NULL && fast != NULL)
            {
                slow = slow->next;      
                if (fast->next == NULL) return NULL;
                fast = fast->next->next;
                if (slow == fast)    
                {
                    isCycle = true;    
                    break;
                }
            }
    
            if (!isCycle) return NULL; 
            slow = head;
            while (slow != fast)    
            {
                slow = slow->next;      
                fast = fast->next;      
            }
        
            return slow;
    
        }
    };

  • 相关阅读:
    算法导论--平摊分析之聚集分析
    编译器开发系列--Ocelot语言3.类型名称的消解
    编译器开发系列--Ocelot语言2.变量引用的消解
    编译器开发系列--Ocelot语言1.抽象语法树
    算法导论--散列表的数学分析(精解)链表法
    Linux2.6内核协议栈系列--TCP协议2.接收
    日常‘说说’(回归 原森雨)
    那些玩枪战我特别想听到的声音!
    友链!
    晚安背后的秘密
  • 原文地址:https://www.cnblogs.com/douzujun/p/10657735.html
Copyright © 2011-2022 走看看