【每日一题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;      
    }
}

image.png

快慢指针

2023/07/30


思路:


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

image.png

  • 可得从相遇点到入环点的距离加上n-1圈的环长,恰好等于从链表头部到入环点的距离。
  • 因此,当快慢指针相遇时,再额外用一个指针指向链表头部,随后,它和慢指针每次向后移动一个位置。最终,它们会在入环点相遇。


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

  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;
    }
}

image.png

目录
相关文章
|
2月前
|
数据库
数据结构中二叉树,哈希表,顺序表,链表的比较补充
二叉搜索树,哈希表,顺序表,链表的特点的比较
数据结构中二叉树,哈希表,顺序表,链表的比较补充
|
4月前
链表指针的传参,传值和传地址
本文讨论了链表操作中指针传参的问题,特别是指针的传值与传地址的区别,并提供了修正代码,以确保链表插入操作能正确地修改指针指向的地址。
28 1
链表指针的传参,传值和传地址
|
3月前
|
算法 索引
单链表题+数组题(快慢指针和左右指针)
单链表题+数组题(快慢指针和左右指针)
50 1
|
9月前
|
存储 C语言
用指针处理链表
用指针处理链表
81 3
|
4月前
|
C语言
无头链表二级指针方式实现(C语言描述)
本文介绍了如何在C语言中使用二级指针实现无头链表,并提供了创建节点、插入、删除、查找、销毁链表等操作的函数实现,以及一个示例程序来演示这些操作。
56 0
|
7月前
【数据结构OJ题】复制带随机指针的链表
力扣题目——复制带随机指针的链表
67 1
【数据结构OJ题】复制带随机指针的链表
|
8月前
|
存储 算法 数据可视化
深入解析力扣160题:相交链表的解决方法(哈希表法与双指针法详细图解)
深入解析力扣160题:相交链表的解决方法(哈希表法与双指针法详细图解)
|
9月前
DAY-2 | 哈希表、指针与区间划分:字符种数统计问题
```markdown ## 题干 [牛客网链接](https://www.nowcoder.com/practice/eb94f6a5b2ba49c6ac72d40b5ce95f50) ## 题解 1. **查表法(哈希表)**:利用数组标记出现过的 ASCII 值小于127的字符,首次出现计数,重复则忽略。 2. **指针与区间划分(回头法)**:遍历字符串,对每个字符检查其前所有字符是否重复,重复则不计数。 ## 方法总结 - 哈希表在去重问题中非常实用,可多做相关练习。 - 使用`continue`时注意避免死循环,确保循环变量会改变。 - 多回顾此类问题以巩固理解。 ```
60 2
|
8月前
|
算法
【经典LeetCode算法题目专栏分类】【第7期】快慢指针与链表
【经典LeetCode算法题目专栏分类】【第7期】快慢指针与链表
|
9月前
|
算法
"刷题记录:哈希表+双指针 | leetcode-2465. 不同的平均值数目 "
该文段是一篇关于编程题目的解答,主要讨论如何找到数组中所有不同平均值的个数。作者首先使用排序和哈希集来解决,将数组转为列表排序后,通过双指针计算平均值并存入哈希集以去重。然后,作者发现可以优化方案,通过双指针在排序后的数组中直接计算两数之和,用哈希集记录不重复的和,从而避免实际计算平均值,提高了算法效率。最终代码展示了这两种方法。
73 0