zoukankan      html  css  js  c++  java
  • LeetCode 142. Linked List Cycle II 判断环入口的位置 C++/Java

    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 poswhich 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.

    这题解题的思路在于:在第一次相遇点位置pos,从该位置到环入口Join的距离=从头结点Head到环入口Join的距离

    假设环的长度是r,在第一次相遇时,慢指针走过的路程:s=lenA+x,快指针走过的路程:2s=lenA+nr+x,所以:lenA+x=nr,即:LenA=nr-x。

    所以在第一次相遇之后,一个指针从head走到join的路程,另一个指针从pos走到join。

    方法一(C++)

     1 ListNode *detectCycle(ListNode *head) {
     2         ListNode* slow=head,*fast=head;
     3         while(fast&&fast->next){
     4             slow=slow->next;
     5             fast=fast->next->next;
     6             if(slow==fast)
     7                 break;
     8         }
     9         if(!fast||!fast->next)
    10             return NULL;
    11         slow=head;
    12         while(slow!=fast){
    13             slow=slow->next;
    14             fast=fast->next;
    15         }
    16         return slow;
    17     }

    (java):

     1 ListNode slow=head,fast=head;
     2         while(fast!=null&&fast.next!=null){
     3             slow=slow.next;
     4             fast=fast.next.next;
     5             if(slow==fast)
     6                 break;
     7         }
     8         if(fast==null||fast.next==null)
     9             return null;
    10         slow=head;
    11         while(slow!=fast){
    12             slow=slow.next;
    13             fast=fast.next;
    14         }
    15         return slow;
    16     }
  • 相关阅读:
    Django学习笔记(进阶篇)
    Django学习笔记(基础篇)
    vim的使用
    PyCharm默认文件头部的设置
    Django的内置登录、退出、修改密码方法
    vbox manjaro 无法挂载共享文件 解决办法
    vbox虚拟机 无法启动 新任务
    Ubuntu安装输入法
    安装 protobuf
    Manjaro.常用命令
  • 原文地址:https://www.cnblogs.com/hhhhan1025/p/10619452.html
Copyright © 2011-2022 走看看