leetcode 链表+双指针问题小结

news2024/10/7 11:25:14

文章目录

    • 141. 环形链表
    • 142. 环形链表 II
    • 19. 删除链表的倒数第 N 个结点
    • 160. 相交链表

141. 环形链表

在这里插入图片描述
设置两个速度不一样的链表,如果其中他们两个在经过一定的步数(进入环之后,在 n × ∣ 环的大小 ∣ n \times |环的大小| n×环的大小 步后会重合)之后会重合,则说明有环。

# Definition for singly-linked list.
class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None

class Solution:
    def hasCycle(self, head: Optional[ListNode]) -> bool:
        head_i = head
        head_j = head

        while(head_i is not None and head_j is not None):
            head_i = head_i.next
            head_j = head_j.next
            if head_j is None:
                return False
            else:
                head_j = head_j.next
            
            total += 1
            if head_i == head_j:
                return True
        
        return False

142. 环形链表 II

在这里插入图片描述
这里与上一题不同的地方在于需要求得环的入口。
设慢指针的步数为s,则第一次相遇时,快指针的步数为2s=s+nb,其中b为环的长度。化简可以得到s=nb。
在二者相遇之后,我们将快指针回退到head的位置。假设快指针又经过a步到达环的入口,此时慢指针步数为a+s=a+nb,一定也会到达环口。因此只需要再求出这时二者相遇的位置即可。

在这里插入图片描述

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution(object):
    def detectCycle(self, head):
        if not head:
            return None
        """
        :type head: ListNode
        :rtype: ListNode
        """
        head_slow = head
        head_fast = head

        while(True):
            if not head_fast.next or not head_fast.next.next:
                return None
            head_slow, head_fast = head_slow.next, head_fast.next.next
            if head_slow == head_fast:
                # 第一次相遇
                break

        head_fast = head
        while(head_fast != head_slow):
            head_fast, head_slow = head_fast.next, head_slow.next

        return head_fast

19. 删除链表的倒数第 N 个结点

在这里插入图片描述

这个让快指针先走n步就可以了。需要注意的是可以设置一个dummy head以处理只有一个node的情况。

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]:
        dummy = ListNode(next=head)
        
        # 设置一个dummy head可以帮助处理只有一个节点的情况
        fast, slow = dummy, dummy
        for i in range(n):
            fast = fast.next

        while(fast.next != None):
            slow = slow.next
            fast = fast.next
        slow.next = slow.next.next

        return dummy.next

160. 相交链表

在这里插入图片描述
这一题的主要思路是两个head均设置一个指针,当某一个指针到达终点之后,去到对方的head重新开始走,走到交叉点一定会相遇,因为这时两个指针的路径长度都是a+b+c。
在这里插入图片描述

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> Optional[ListNode]:

        pointerA = headA
        pointerB = headB
        # 当某一个指针到达终点之后,去到对方的head重新开始走,走到交叉点一定会相遇
        # 因为这时两个指针的路径长度都是a+b+c
        while(pointerA != pointerB):
            pointerA = pointerA.next if pointerA else headB 
            pointerB = pointerB.next if pointerB else headA 

        if pointerA == pointerB and pointerB is not None:
            return pointerA
            
        return None

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/635343.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis的复制

配置 在Redis中使用复制功能非常容易 在从Redis服务器的redis.conf中写入slaveof masterip masterport即可,主Redis服务器不需要做任何配置在启动Redis服务器的时候,指定主服务器,redis-server --slaveof masterip masterport在客户端指定主…

038_SSS_Multi-Architecture Multi-Expert Diffusion Models

Multi-Architecture Multi-Expert Diffusion Models 1. Motivations & Arguments & Contributions 本文提出了一种在diffusion的不同步数采用不同的网络结构的方法提高生成质量和效率。 Diffusion模型需要大量的计算时间成本,改进方式主要有两个方面&…

教你用栈实现队列怎么写

大家好,我是三叔,很高兴这期又和大家见面了,一个奋斗在互联网的打工人。 队列(Queue)和栈(Stack)是两个基本的数据结构。队列是一种先进先出(First-In-First-Out, FIFO)…

【Spring】——Spring生命周期

前言 ❤️❤️❤️Spring专栏更新中,各位大佬觉得写得不错,支持一下,感谢了!❤️❤️❤️ Spring_冷兮雪的博客-CSDN博客 前面我们讲完了Spring中有关Bean的读和取,我们还没有好好去了解了解Bean对象,这篇 …

XML文件原理详解

文章目录 一、简介1. XML定义2. 测试3. HTML和XML的区别 二、XML基本语法1. 语法规则2. 元素的属性3. CDATA4. DTD文件5. XSD文件 三、Java解析XML1. 简介2. 解析XML文件 四、Xpath1. 简介2. Xpath的使用 一、简介 1. XML定义 XML(可扩展标记语言)是一…

高压放大器在介电材料中的应用有哪些

高压放大器是一种能够输出高电压的放大器,具有多种应用,其中之一就是在介电材料中的应用。介电材料是指能够保持一定电荷和电场状态的物质,其特点包括绝缘性、极化性和介电常数等。下面安泰电子将详细介绍高压放大器在介电材料中的应用。 介电…

《HarmonyOS开发 – OpenHarmony开发笔记(基于小型系统)》第4章 OpenHarmony应用开发实例

开发环境: 开发系统:Ubuntu 20.04 开发板:Pegasus物联网开发板 MCU:Hi3861 OpenHarmony版本:3.0.1-LTS 4.1新建工程及配置 1.新建工程及源码 新建目录 $ mkdir hello在applications/sample/myapp中新建src目录以及…

【零基础学机器学习 5】机器学习中的分类:什么是分类以及分类模型

👨‍💻 作者简介:程序员半夏 , 一名全栈程序员,擅长使用各种编程语言和框架,如JavaScript、React、Node.js、Java、Python、Django、MySQL等.专注于大前端与后端的硬核干货分享,同时是一个随缘更新的UP主. 你可以在各个…

华为OD机试真题 JavaScript 实现【字符串加密】【2023Q1 100分】,附详细解题思路

一、题目描述 有一种技巧可以对数据进行加密,它使用一个单词作为它的密匙。下面是它的工作原理:首先,选择一个单词作为密匙,如TRAILBLAZERS。如果单词中包含有重复的字母,只保留第1个,将所得结果作为新字母…

Spark大数据处理学习笔记(2.4)IDEA开发词频统计项目

该文章主要为完成实训任务,详细实现过程及结果见【http://t.csdn.cn/0qE1L】 文章目录 一、词频统计准备工作1.1 安装Scala2.12.151.2 启动集群的HDFS与Spark1.3 在HDFS上准备单词文件 二、本地模式运行Spark项目2.1 新建Maven项目2.2 添加项目相关依赖2.3 创建日志…

009:vue中el-table删除当前行的代码示例

第009个 查看专栏目录: VUE — element UI echarts,openlayers,cesium,leaflet,mapbox,d3,canvas 免费交流社区 专栏目标 在vue和element UI联合技术栈的操控下,本专栏提供行之有效的源代码示例…

计算机网络(网络层,传输层,应用层,复习自用)

计算机网络 网络层网络层功能IP数据报格式IP数据报分片IPV4地址网络地址转换(NAT)子网划分与子网掩码无分类编址CIDRARP协议DHCP协议ICMP协议IPV6路由算法及路由协议RIR协议及距离向量算法OSPF协议及链路状态算法BGP协议IP组播移动IP网络层设备 传输层传…

Linux 部署Java项目-jar包和war包(五)

文章目录 一、前景(jar包和war包区别)一、部署jar包程序1. 项目打成jar包①方式一:使用idea工具打包项目②方式二:通过cmd命令的方式打包项目 2. 项目命令启动① 查看之前启动的程序,关闭之② 启动程序③ 验证是否部署…

Vue中如何进行数据筛选与搜索功能实现

Vue中如何进行数据筛选与搜索功能实现 在Vue应用中,数据筛选和搜索是常见的需求。本文将介绍如何在Vue中进行数据筛选和搜索功能的实现,包括基于原生JavaScript的筛选和搜索、基于Lodash库的筛选和搜索、以及基于Vue插件的筛选和搜索。 基于原生JavaScr…

Hazel游戏引擎(012)GLFW窗口事件

文中若有代码、术语等错误,欢迎指正 文章目录 前言如何确定GLFW窗口事件的回调函数参数Application接收事件回调流程原项目流程(12345)自己写的简单Demo与流程(123) 前言 此节目的 为了完成008计划窗口事件的接收glfw窗口事件以及回调部分 此节要完成 使用glfw函数…

C语言之指针初阶(1)

本章重点 1. 指针是什么 2. 指针和指针类型 3. 野指针 4. 指针运算 5. 指针和数组 6. 二级指针 7. 指针数组 今天我们讲解前4个稍微简单一点的内容,下一篇博客讲解后三部分 首先引入话题 我们口语讲到指针,比如p指针,其实想要…

【0基础自研记录】ESP32-CAM自制个人网络监控

目的:实现一个小型家庭监控 一、前期准备 1.硬件准备 esp32-acm烧录板烧录线 2.软件准备 Arduion IDE CH340串口驱动 下载地址如下 Arduion IDE:https://www.arduino.cc/en/software CH340串口驱动 链接:https://pan.baidu.com/s/1ri8dK7wW6KFz8rOPs…

已知一个整数,如何判断这个整数是无符号的?

前言 记录6月11日,肯哥在群里面分享的一个问题。说实话,看到题目想了半天没明白。一看答案,才发现,这题真的简单。 题目 已知一个整数,如何判断这个整数是无符号的? 题解 (1)因为我的…

JVM相关特性

每个使用Java的开发者都知道Java字节码是在JRE中运行(JRE: Java 运行时环境)。JVM则是JRE中的核心组成部分,承担分析和执行Java字节码的工作,而Java程序员通常并不需要深入了解JVM运行情况就可以开发出大型应用和类库。尽管如此,如果你对JVM有…

008:vue中el-upload不显示上传的文件列表

第008个 查看专栏目录: VUE — element UI echarts,openlayers,cesium,leaflet,mapbox,d3,canvas 免费交流社区 专栏目标 在vue和element UI联合技术栈的操控下,本专栏提供行之有效的源代码示例…