zoukankan      html  css  js  c++  java
  • [LeetCode]LinkedListCycle 和LinkedListCycle2

    题目1:

    Given a linked list, determine if it has a cycle in it.

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

    题目2:

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

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

    思路1:快慢指针,查找是否存在环。

    思路2:

    一个链表中包含环,请找出该链表的环的入口结点。

    判断是否包含环:快慢指针,fast的速度是low的2倍。如果存在fast=low,那就存在环。
     找环的入口,则有数学公式:
     设起点到环入口的距离为a,入口到相遇的距离为b,相遇后到入口的距离为c 则因为fast是low的2倍,
     Sfast = a+b+c+b
     Slow = a+b
     Sfast = 2Slow a+b+c+b = 2(a+b) -> c = a
     得到c=a这个结论就好办了,在第一次相遇之后,让fast回到起点,fast和low都每次移动一个单位,
     low走过c距离,fast走过a距离,是一样的,刚好回到环的入口点。

     1 public class LinkedListCycle {
     2     public boolean hasCycle(ListNode head) {
     3         if(head == null) return false;
     4         ListNode fast = head;
     5         ListNode slow = head;
     6         while(fast.next!=null&&fast.next.next!=null){
     7             fast = fast.next.next;
     8             slow = slow.next;
     9             if(fast == slow){
    10                 return true;
    11             }
    12         }
    13         return false;
    14         
    15     }
    16 }
     1 public class LinkedListCycle2 {
     2     public ListNode detectCycle(ListNode head) {
     3         
     4         if(head == null || head.next == null){
     5             return null;
     6                 
     7         }
     8         ListNode fast = head;
     9         ListNode low = head;
    10         while(fast.next!=null){
    11             fast = fast.next.next;
    12             low = low.next;
    13             
    14             if(fast == low){
    15                 fast = head;
    16                 while(fast!=low){
    17                     fast = fast.next;
    18                     low = low.next;
    19                 }
    20                 if(fast == low){
    21                     return low;
    22                 }
    23             }
    24         }
    25         return null;
    26     
    27     }
    28 }
  • 相关阅读:
    Redis代理与集群的总结报告
    redis代理对比,redis架构对比,redis predixy安装和功能测试
    kafka学习方向系列
    redis-cluster-proxy安装使用尝试
    redis6集群安装与运维管理
    kafka集群搭建(利用集成zk集群)
    vue-property-decorator用法介绍
    软件世界的基石:重要开源项目盘点
    ECMAScript 6 入门
    windows下快速删除node_modules
  • 原文地址:https://www.cnblogs.com/zlz099/p/9293422.html
Copyright © 2011-2022 走看看