142链表-环形链表

Posted 孤注一掷 、

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了142链表-环形链表相关的知识,希望对你有一定的参考价值。

题目

 链接:142. 环形链表 II - 力扣(LeetCode)

思路

首先判断链表是否有环:

使用快慢指针法,分别定义fast和slow,从头结点出发,fast每次移动两个节点,slow每次移动一个节点,如果fast和slow在中途相遇,说明链表有环。

如果有环如何找到这个环的入口:

 如图,相遇时slow走过的为:x+y,fast走过的为:x+y+n(y+z)

则(x+y)*2 = x+y+n(y+z),整理为:x = (n-1)(y+z)+z

即n为1时,x=z

n大于1时效果是一样的,只不过多转了几圈

代码

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)//有环
                ListNode index1 = fast;
                ListNode index2 = head;
                //两个指针,从头结点和相遇结点,各走一步,直到相遇,相遇点即为环入口
                while(index1 != index2)
                    index1 = index1.next;
                    index2 = index2.next;
                
                return index1;
            
        
        return null;
    

以上是关于142链表-环形链表的主要内容,如果未能解决你的问题,请参考以下文章

图解 LeetCode142:环形链表,你的入口在哪?

图解 LeetCode142:环形链表,你的入口在哪?

算法热门:环形链表的又一解法(LeetCode 142)

LeetCode 142. 环形链表 II(逻辑环链表快慢双指针)

LeetCode.链表.141+142环形链表,附详细证明过程+多图分析

20-链表练习-LeetCode142环形链表II