【每日一题Day281】LC142链表 Ⅱ| 快慢指针 哈希表

这篇具有很好参考价值的文章主要介绍了【每日一题Day281】LC142链表 Ⅱ| 快慢指针 哈希表。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

环形链表 Ⅱ【LC142】

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

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。

不允许修改 链表。

作者:力扣 (LeetCode)
链接:https://leetcode-cn.com/leetbook/read/linked-list/jjhf6/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

哈希表
  • 思路:使用哈希表存放链表中的节点,找到第一个在哈希表中重复出现的结点,即为环的入口

  • 2021/12/9

    /**
     * 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) {
            Set<ListNode> seen = new HashSet<>();  
            while(head!=null){
                if(!seen.add(head)){
                    return head;
                }
                head = head.next;
            }
            return null;      
        }
    }
    
  • 复杂度分析

    • 时间复杂度: O ( N ) O(N) O(N),其中 N N N是链表中的节点数。
    • 空间复杂度: O ( N ) O(N) O(N)
快慢指针
  • 2023/07/30

  • 思路:

    • 首先,由LC141可知,如果链表中存在环,那么快慢指针会在环中相遇,但相遇的位置不一定是入环口,如下图所示。设链表中环外部分的长度为a,慢指针进入环后,又走了b的距离与快指针相遇。此时,快指针已经走完了环的n圈,因此快指针走过的总距离为 a + n ( b + c ) + b a+n(b+c)+b a+n(b+c)+b

    • 由任意时刻,快指针走过的距离都为慢指针的2倍。因此,有
      a + ( n + 1 ) b + n c = 2 ( a + b ) − − > a = c + ( n − 1 ) ( b + c ) a+(n+1)b+nc=2(a+b)--> a=c+(n-1)(b+c) a+(n+1)b+nc=2(a+b)>a=c+(n1)(b+c)

    • 可得从相遇点到入环点的距离加上n-1圈的环长,恰好等于从链表头部到入环点的距离。

    • 因此,当快慢指针相遇时,再额外用一个指针指向链表头部,随后,它和慢指针每次向后移动一个位置。最终,它们会在入环点相遇。

【每日一题Day281】LC142链表 Ⅱ| 快慢指针 哈希表,每日一题,链表,链表,散列表,数据结构

  • 为什么慢指针入环第一圈没走完的时候就会和快指针相遇?

    1. 首先,快指针先进入环
    2. 当慢指针刚到达环的入口时,快指针此时在环中的某个位置(此时也可能相遇)
    3. 假设此时快慢指针的距离为x,若在步骤2相遇,则x=0
    4. 环的周长为n,那么看成快指针追赶慢指针,需要追赶n-x个单位
    5. 快指针每次都追赶慢指针1个单位,那么慢指针走了n-x个单位,又因为x>0,则慢指针走的路程小于等于n,因此慢指针走不完一圈就会与快指针相遇
  • 代码

    public class Solution {
        public ListNode detectCycle(ListNode head) {
            ListNode slowNode = head;
            ListNode fastNode = head;
            while (fastNode != null && fastNode.next != null){
                slowNode = slowNode.next;
                fastNode = fastNode.next.next;
                if (slowNode == fastNode){
                    ListNode curNode = head;
                    while (curNode != fastNode ){
                        curNode = curNode.next;
                        fastNode = fastNode.next;
                    }
                    return curNode;
                }
            }
            
            return null;
        }
    }
    
  • 复杂度分析文章来源地址https://www.toymoban.com/news/detail-617208.html

    • 时间复杂度: O ( N ) O(N) O(N),其中 N N N是链表中的节点数。
    • 空间复杂度: O ( 1 ) O(1) O(1)

到了这里,关于【每日一题Day281】LC142链表 Ⅱ| 快慢指针 哈希表的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 力扣hot100 环形链表 快慢指针 哈希 数学公式

    Problem: 142. 环形链表 II 👨‍🏫 参考题解 ⏰ 时间复杂度: O ( n ) O(n) O ( n ) 🌎 空间复杂度: O ( 1 ) O(1) O ( 1 )

    2024年01月23日
    浏览(32)
  • 【每日一题Day282】LC2681英雄力量 | 排序+数学

    给你一个下标从 0 开始的整数数组 nums ,它表示英雄的能力值。如果我们选出一部分英雄,这组英雄的 力量 定义为: i0 , i1 ,… ik 表示这组英雄在数组中的下标。那么这组英雄的力量为 max(nums[i0],nums[i1] ... nums[ik])2 * min(nums[i0],nums[i1] ... nums[ik]) 。 请你返回所有可能的 非空

    2024年02月14日
    浏览(33)
  • 【每日一题Day168】LC2427公因子的数目 | 模拟

    给你两个正整数 a 和 b ,返回 a 和 b 的 公 因子的数目。 如果 x 可以同时整除 a 和 b ,则认为 x 是 a 和 b 的一个 公因子 。 简单模拟 感谢力扣 今天还要开会 我恨 感觉习惯真的很容易突然改变 前段时间还是看英文题目的 突然每一天就没有看英文题了 然后这个习惯就没有了

    2023年04月08日
    浏览(26)
  • 【每日一题Day256】LC2600K 件物品的最大和

    袋子中装有一些物品,每个物品上都标记着数字 1 、 0 或 -1 。 给你四个非负整数 numOnes 、 numZeros 、 numNegOnes 和 k 。 袋子最初包含: numOnes 件标记为 1 的物品。 numZeroes 件标记为 0 的物品。 numNegOnes 件标记为 -1 的物品。 现计划从这些物品中恰好选出 k 件物品。返回所有可行

    2024年02月12日
    浏览(89)
  • 【每日一题Day222】LC1110删点成林 | dfs后序

    给出二叉树的根节点 root ,树上每个节点都有一个不同的值。 如果节点值在 to_delete 中出现,我们就把该节点从树上删去,最后得到一个森林(一些不相交的树构成的集合)。 返回森林中的每棵树。你可以按任意顺序组织答案。 又是一段瓶颈期 2023/5/30 思路 遍历树时,如果

    2024年02月07日
    浏览(32)
  • 【每日一题Day224】LC2517礼盒的最大甜蜜度 | 二分答案

    礼盒的最大甜蜜度【LC2517】 You are given an array of positive integers price where price[i] denotes the price of the ith candy and a positive integer k . The store sells baskets of k distinct candies. The tastiness of a candy basket is the smallest absolute difference of the prices of any two candies in the basket. Return the maximum tastiness of a

    2024年02月07日
    浏览(28)
  • 【每日一题Day262】LC1911最大子序列交替和 | dp

    最大子序列交替和【LC1911】 一个下标从 0 开始的数组的 交替和 定义为 偶数 下标处元素之 和 减去 奇数 下标处元素之 和 。 比方说,数组 [4,2,5,3] 的交替和为 (4 + 5) - (2 + 3) = 4 。 给你一个数组 nums ,请你返回 nums 中任意子序列的 最大交替和 (子序列的下标 重新 从 0 开始编

    2024年02月15日
    浏览(28)
  • 【每日一题Day191】LC2423删除字符使频率相同 | 枚举 分类讨论

    给你一个下标从 0 开始的字符串 word ,字符串只包含小写英文字母。你需要选择 一个 下标并 删除 下标处的字符,使得 word 中剩余每个字母出现 频率 相同。 如果删除一个字母后, word 中剩余所有字母的出现频率都相同,那么返回 true ,否则返回 false 。 注意: 字母 x 的 频

    2024年02月01日
    浏览(31)
  • 【每日一题Day267】LC834树中距离之和 | 换根dp

    树中距离之和【LC834】 给定一个无向、连通的树。树中有 n 个标记为 0...n-1 的节点以及 n-1 条边 。 给定整数 n 和数组 edges , edges[i] = [ai, bi] 表示树中的节点 ai 和 bi 之间有一条边。 返回长度为 n 的数组 answer ,其中 answer[i] 是树中第 i 个节点与所有其他节点之间的距离之和。

    2024年02月16日
    浏览(27)
  • 【每日一题Day292】LC1572矩阵对角线元素的和 模拟

    思路 简单模拟,主对角线的元素横纵坐标相等,副对角线的元素横纵坐标相加为n-1,注意避免重复计算 实现 复杂度 时间复杂度: O ( log ⁡ n ) mathcal{O}(log n) O ( lo g n ) 空间复杂度: O ( 1 ) mathcal{O}(1) O ( 1 )

    2024年02月13日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包