zoukankan      html  css  js  c++  java
  • LeetCode-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.
    

    Follow up:
    Can you solve it without using extra space?

    空间复杂度O(n)

    public ListNode detectCycle(ListNode head) {//链表 my
            Set<ListNode> nodeSet = new HashSet<ListNode>();
            while(null!=head){
                if(nodeSet.contains(head)){
                    return head;
                }
                else{
                    nodeSet.add(head);
                    head=head.next;
                }
            }
            return null;
        }
    

    空间复杂度O(1)

    a=从头结点-》环入口的距离,b=从环入口-》快慢两个结点的相遇处的距离,c=环的长度-b。

    快结点走的长度=a+b+c+b,慢结点走的长度=a+b;所以a+b+c+b=2(a+b),可得a=c。

    故慢结点从相遇的结点继续走,一步一个结点,另一结点从头结点开始走,一步一个结点,两个结点相遇处就是环入口。

     1 public ListNode EntryNodeOfLoop(ListNode pHead){//链表 my
     2         if(null==pHead||null==pHead.next){
     3             return null;
     4         }
     5         ListNode one = pHead.next;
     6         ListNode two = pHead.next.next;
     7         while(null!=one&&null!=two&&null!=two.next&&one!=two){
     8             one = one.next;
     9             two = two.next.next;
    10         }
    11         if(null==two||null==two.next||null==one){
    12             return null;
    13         }
    14         two = pHead;
    15         while(one !=two){
    16             one = one.next;
    17             two = two.next;
    18         }
    19         return one ;
    20     }

    简洁代码

    public ListNode detectCycle(ListNode head) {//mytip
            ListNode oneStep =head;
            ListNode twoStep = head;
            while(null!=oneStep&&null!=twoStep&&null!=twoStep.next){
                oneStep=oneStep.next;
                twoStep= twoStep.next.next;
                if (oneStep==twoStep){
                    twoStep=head;
                    while(twoStep!=oneStep){
                        twoStep=twoStep.next;
                        oneStep=oneStep.next;
                    }
                    return oneStep;
                }
            }
            return null;
        }
    

      

     相关题

    判断链表是否有环 LeetCode141   https://www.cnblogs.com/zhacai/p/10560803.html

  • 相关阅读:
    系统安全及应用
    进程和计划任务管理
    Java技术体系
    开机十步和进程管理
    Raid
    LVM逻辑卷
    sed命令
    磁盘管理
    你的背景,是这个时代 张璁
    别将梦想停留在二十岁
  • 原文地址:https://www.cnblogs.com/zhacai/p/10561152.html
Copyright © 2011-2022 走看看