博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
环形链表 II 转载 https://blog.csdn.net/forever______/article/details/85103234#_1
阅读量:6325 次
发布时间:2019-06-22

本文共 1362 字,大约阅读时间需要 4 分钟。

给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。

为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。

说明:不允许修改给定的链表。

示例 1:

输入:head = [3,2,0,-4], pos = 1输出:tail connects to node index 1解释:链表中有一个环,其尾部连接到第二个节点。复制代码

示例 2:

输入:head = [1,2], pos = 0输出:tail connects to node index 0解释:链表中有一个环,其尾部连接到第一个节点。复制代码

示例 3:

输入:head = [1], pos = -1输出:no cycle解释:链表中没有环。复制代码

用两个指针同时遍历链表,快指针每次走两步,慢指针每次走一步。如果链表中有环,那么他们终将相遇。可证:自他们相遇后,指针1从起点每次走一步,指针2从相遇点每次走一步,指针1和指针2相遇处就是环的起点。证明如下:

如下图,设Y点为环起点,Z点为快慢指针相遇点,abc为这几个关键节点间的路程(可能包括很多节点)。

因为,相遇时快指针走过的路程肯定为慢指针走过的路程的2倍。得:

(a+b)2 = a+b+(b+c)n //n>=1,n为快指针在相遇前绕环的圈数

解方程得 a = (b+c)(n-1)+c

所以:

当n=1时,a=c

当n>1时,a=c+n圈

得证。

时间复杂度O(n)

/** * Definition for singly-linked list. * class ListNode { *     int val; *     ListNode next; *     ListNode(int x) { *         val = x; *         next = null; *     } * } */public class Solution {    public ListNode detectCycle(ListNode head) {        ListNode slow = head;        ListNode fast = head;        while( fast != null && fast.next != null ){            slow = slow.next ;             fast = fast.next.next;            if(slow == fast ){                break;            }        }        if( fast == null || fast.next== null ){            return null;        }        while( head != slow ){            head = head.next;            slow = slow.next;        }        return head;    }}复制代码

转载地址:http://spqaa.baihongyu.com/

你可能感兴趣的文章
linux内存管理之kmalloc
查看>>
git常见操作--忽略文件以及常用命令【转】
查看>>
javascript 如何用POST方式(以及Get方式) 向服务器端提交数据
查看>>
git 使用详解(8)-- tag打标签
查看>>
【C#】利用JMail发送邮件
查看>>
关于URI URL URN
查看>>
NeHe OpenGL教程 第二十六课:反射
查看>>
iOS:内存管理(三):在Objective-c里面使用property教程
查看>>
用Sql Server 2000的数据库备份来还原Sql Server 2005中的数据库
查看>>
读书笔记2014第8本:《追寻生命的意义》
查看>>
Kafka实战-Storm Cluster
查看>>
Android总结篇系列:Android 权限
查看>>
R学习笔记 第五篇:字符串操作
查看>>
在Mac OS下配置PHP开发环境
查看>>
(转)介绍下Nuget在传统Asp.net项目中的使用
查看>>
C# ArcEngine 实现点击要素高亮并弹出其属性
查看>>
c#线程初探(一)
查看>>
初识GO语言——安装Go语言
查看>>
SDK命令行操作
查看>>
基于Bootstrap的DropDownList的JQuery组件的完善版
查看>>