首页 > 其他分享 >LeetCode | 141 linked list cycle

LeetCode | 141 linked list cycle

时间:2024-08-04 16:28:51浏览次数:14  
标签:head slow list 相遇 fast 链表 cycle linked 指针

https://github.com/dolphinmind/datastructure/tree/datastructure-linkedlist

分析

证明过程

基本假设

  • 假设环的长度为(C)
  • 假设从链表的头部到环的入口点的距离为(A)
  • 假设从环的入口点到快慢指针第一次相遇点的距离为(B)
  • 假设从快慢指针第一次相遇点回到环的入口点的距离为(C-B)

证明过程

  1. 慢指针的移动
  • 慢指针每次移动一步
  • 当慢指针进入环后,它会沿着环移动,直到与快指针相遇
  1. 快指针的移动
  • 快指针每次移动两步
  • 当快指针进入环后,它也会沿着环移动,直到与慢指针相遇
  1. 相遇点分析
  • 当快指针和慢指针相遇时,假设慢指针走了(x)步,那么快指针走了(2x)步
  • 慢指针从链表头部到相遇点的距离为(A+B+rC),其中(r)是慢指针在环内绕圈的次数
  • 快指针从链表头部到相遇点的距离为(A+B+kC),其中(k)是快指针在环内绕圈的次数
  • 因为快指针的速度是慢指针的两倍,所以快指针走的距离是慢指针的两倍,即2(A+B+rC) = A+B+kC
  1. 求解方程
  • 从上述方程可以得出A + B + rC = |k-r|C => A + B = C + hC
  • 这意味着慢指针走过的距离 (A+B+rC)是环长度(C)的整数倍
  • 由于 (A+B+rC)是慢指针从链表头部到相遇点的距离,而(|k-r|C)是快指针在环内绕圈的总长度,这意味着快指针和慢指针在环内相遇

这时可以发现快指针离环入口只需要走(C-B) + hC 距离,与链表的头部到环入口距离一致,将快指针回填到链表头部,类似于尾对齐发,即找到了相交点

主类

package com.github.dolphinmind.linkedlist;

import com.github.dolphinmind.linkedlist.uitls.ListNode;

/**
 * @author dolphinmind
 * @ClassName LinkedListCycle
 * @description 141. 环形链表
 * @date 2024/8/4 slow的速度v = 1
 *                fast的速度v = 2
 *                在没有环的情况下,fast会最先到达末尾,从而返回false
 *                在有环的情况下,  fast在未进入环之前的情况和上述类似,fast进入环之后,fast开始在环内转圈
 *                直到slow也进入圈内,两者的相对速度为v = 1,此时fast指针反追击slow,直到fast追击到slow为止
 *                刚刚在思考的时候,突然想起链表相交的问题:发觉160链表相交问题与当前141环形链表问题有一定的相似性
 *
 *                假设 headA = 1->2->3->4
 *                    headB = 5->6->7->8->9->4
 *
 *                    slow  = 1->2->3->4->5->6->7->8->9->4
 *                    fast  = 5->6->7->8->9->4->1->2->3->4
 *
 *                  head = 1->2->3->4->5->6->7->8->4
 *                  slow = 1->2->3->4->5->6->7->8->4->5->6
 *                  fast = 1->3->5->7->4->6->8->5->7->4->6
 */

public class LinkedListCycle {

    /**
     * 双指针法
     * @param head
     * @return
     */
    public boolean hasCycleTowPointer(ListNode<?> head) {

        if (head == null || head.next == null) {
            return false;
        }

        ListNode<?> slow = head;
        ListNode<?> fast = head;

        while (fast != null && fast.next != null) {
            fast = fast.next.next;
            slow = slow.next;

            if (slow == fast) {
                return true;
            }
        }

        return false;

    }



}


标签:head,slow,list,相遇,fast,链表,cycle,linked,指针
From: https://www.cnblogs.com/dolphinmind/p/18341909

相关文章

  • 易优CMS模板标签uiarclist文档列表
    【基础用法】标签:uiarclist描述:文档列表编辑,比uitext、uihtml、uiupload标签多了一个typeid属性,使用时结合html一起才能完成可视化布局,只针对具有可视化功能的模板。用法:<divclass="eyou-edit"e-id="文件模板里唯一的数字ID"e-page='文件模板名'e-type="arclist">{eyou:uiar......
  • 在Python中,list1[::] = list2的空间复杂度是多少?
    此代码首先迭代列表nums,更新整数0、1、2(也分别称为红色、白色和蓝色)的计数。nums保证只有整数0、1和/或2。找到计数后,代码使用[::],这是一种就地修改列表的技巧,以排序numsdefsortColors(self,nums:List[int])->None:re......
  • Python 基础教程:List(列表)的使用
    《Python基础教程:List(列表)的使用》在Python中,列表是最基本的数据结构之一,它是一种有序的、可变的数据集合,可以包含任意类型的元素,包括数字、字符串、其他列表等。1.列表的创建列表使用方括号[]创建,列表中的元素用逗号,分隔。#创建一个包含整数的列表numbers......
  • LeetCode | 160 Intersection of two linkedlists
    https://github.com/dolphinmind/datastructure/tree/datastructure-linkedlist分析判断两个链表是否相交,转换成了双指针相遇的问题。还是那句话,双指针的本质是遍历,走的路其实一样/***解决两个链接不相交而陷入无限循环的情况*初......
  • Java使用多线程池给List赋值导致List存在空的处理
    错误示例:publicList<String>test()throwsNuMaxCloudCommonException{ExecutorServiceexecutorService=Executors.newFixedThreadPool(3);List<String>list=newArrayList<>();for(inti=0;i<3;i++){......
  • python用List的内建函数list.sort进行排序
    对List进行排序,Python提供了两个方法方法1用List的内建函数listsort进行排序listsort(func=None,key=None,reverse=False)Python实对List进行排序,Python提供了两个方法方法1.用List的内建函数list.sort进行排序list.sort(func=None,key=None,reverse=False)>>>list=......
  • SAP 货源清单(Source List)简介
    SAP货源清单(SourceList)简介主要功能创建与维护优点相关事务码前台操作步骤总结货源清单优先级结论SAP货源清单(SourceList)是用于管理和控制采购的关键工具。它记录了某一物料的所有合格供应商以及这些供应商的有效期间。通过货源清单,企业可以确保从特定供......
  • Android开发 - ListRow类解析
    ListRow是什么ListRow是AndroidTV开发中的一个类,用于在应用的用户界面中显示水平滚动的项(如卡片、图像等)列表。它通常在一个BrowseFragment或RowsFragment中使用,以组织和显示内容//创建一个BrowseFragment实例BrowseFragmentbrowseFragment=newBrowseFragment......
  • 搞定Java ArrayList,就看这一篇!
    大家好,我是小欧!今天我们来聊聊Java中的ArrayList。作为一个Java新手,初次接触ArrayList可能会觉得有点懵,不过不用担心,这篇文章会带你从零开始一步步搞定ArrayList。我们会从基础概念开始,然后逐步深入,最后通过几个实际案例来巩固学习成果。ArrayList是什么?简单来说,ArrayLis......
  • Android开发 - RecyclerView 类详解
    什么是RecyclerViewRecyclerView是Android的一个控件,用来展示长列表或网格的内容,它比以前的ListView更加灵活和高效列表展示:想象你在手机上浏览一个长长的商品列表或图片网格。RecyclerView就是用来展示这样的内容的控件高效显示:如果你有一万件商品,RecyclerView不会一......