[LeetCode题解]142. 环形链表 II | 快慢指针
发布日期:2021-05-09 04:32:23 浏览次数:15 分类:博客文章

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

解题思路

本题是在基础上的拓展,如果存在环,要找出环的入口。

如何判断是否存在环,我们知道通过快慢指针,如果相遇就表示有环。那么如何找到入口呢?

如下图所示的链表:

fastslow 第一次相遇时,有以下关系:

fast = 2 * slowslow = a + n*b - c // 假设 slow 走了 n 圈fast = a + m*b - c // 假设 fast 走了 m 圈那就有:a + m*b - c = 2*(a + n*b - c)继而得到:a = c + (m-n)*b而(m-n)*b表示走了 m-n 圈,不影响 c 的大小,即可忽略,最终得到:a = c

通过上面的推导,我们知道相遇点距环的入口的距离(c)与开头到环的入口的距离(a)相等。

因此当 fastslow 相遇时,只要 fast 重新定位到表头,与 slow 一起走,当它们再次相遇时,就是环的入口。

代码

/** * Definition for singly-linked list. * public class ListNode { *     public int val; *     public ListNode next; *     public ListNode(int x) { *         val = x; *         next = null; *     } * } */public class Solution {    public ListNode DetectCycle(ListNode head) {        ListNode fast = head, slow = head;        while(fast != null && fast.next != null){            fast = fast.next.next;            slow = slow.next;            if(fast == slow) { // 存在环                fast = head;                while(fast != slow) {                    fast = fast.next;                    slow = slow.next;                }                return fast;            }        }        return null;    }}

复杂度分析

  • 时间复杂度:\(O(n)\),其中 \(n\) 是链表长度
  • 空间复杂度:\(O(1)\)
上一篇:[LeetCode题解]160. 相交链表 | 双指针 + 哈希表
下一篇:[LeetCode题解]141. 环形链表 | 快慢指针

发表评论

最新留言

做的很好,不错不错
[***.243.131.199]2025年04月20日 07时37分07秒