day04 两两交换链表中的节点、删除链表倒数第N个节点、链表相交、环形链表II

题目链接:leetcode24-两两交换链表中的节点, leetcode19-删除链表倒数第N个节点, leetcode160-链表相交, leetcode142-环形链表II

两两交换链表中的节点

基础题没有什么技巧

解题思路见代码注释
时间复杂度: O(n)
空间复杂度: O(1)

Go

func swapPairs(head *ListNode) *ListNode {if head == nil || head.Next == nil {return head}virtualHead := &ListNode{Next: head}// 指针preNode, curNode := virtualHead, headvar curNodeNext *ListNodefor curNode != nil && curNode.Next != nil {curNodeNext = curNode.Next// 初始:cur指向1,curNext指向2// prevNode ---> 1----> 2 -------> 3//               cur   curNext// curNode与curNodeNext进行节点交换// prevNode ---> 1    2 -------> 3//               |_______________^//              cur   curNextcurNode.Next = curNodeNext.Next//                _______//               V      |// prevNode ---> 1      2        3//               |_______________^//              cur    curNextcurNodeNext.Next = curNode// prevNode ---> 2 -----> 1 -----> 3//              curNext  curpreNode.Next = curNodeNext// 指针移动// 2 -----> 1 -----> 3//          preNode  curpreNode = curNodecurNode = curNode.Next}return virtualHead.Next
}

删除链表倒数第N个节点

思路

节点数范围:1 <= sz <= 30
n范围: 1 <= n <= sz (即n一定时小于节点的数量)
思路:使用快慢指针,slow, fast

  1. 创建一个dummy head
  2. 从dummy开始, 初始slow,fast都指向dummy, fast先移动n个节点
  3. slow和fast同时移动,当fast.Next==nil时,slow所处位置即为倒数第n个节点的前一个节点

example:

dummyH ---> 1 ----> 2 ----> 3 ---> 4

假如n=2, 则要删除倒数第2个节点,即节点3

	初始s和f都指向dummyH:dummyH ---> 1 ----> 2 ----> 3 ---> 4s  ff先移动n个节点:dummyH ---> 1 ----> 2 ----> 3 ---> 4s                  fs和f同时移动:dummyH ---> 1 ----> 2 ----> 3 ---> 4s              f

即当f.Next == nil时,s刚好处于倒数第n个节点的前一个节点,此时只需要执行s.Next = s.Next.Next,就删除了目标节点

时间复杂度: O(n)
空间复杂度: O(1)

Go

func removeNthFromEnd(head *ListNode, n int) *ListNode {if head == nil {return head}dummyH := &ListNode{Next: head}s, f := dummyH, dummyH// f先移动n个节点for i := 0; i < n; i++ {f = f.Next}for f.Next != nil {s = s.Nextf = f.Next}// 此时s所处的位置为倒数第n个节点的前一个节点s.Next = s.Next.Nextreturn dummyH.Next
}

链表相交

思路

方法1:
 使用map将A链表节点存储,遍历B链表时判断当前节点是否已经在map中存在,如果存在当前节点就是相交节点.
 此方法时间复杂度O(m+n),m和n分别是链表A,B的长度, 空间复杂度O(m)
方法2:
 将A B补成等长的链表,如下:
 A: a1—>a2—>c1—>c2—>c3—>b1—>b2—>b3—>c1—>c2—>c3
 B: b1—>b2—>b3—>c1—>c2—>c3—>a1—>a2—>c1—>c2—>c3
可以看到,是在c1处相交
 原理:
  假设A链表中,不相交的节点数量有a,相交的节点数量有c,总长度为a+c
  假设B链表中,不相交的节点数量有b,相交的节点数量有c,总长度为b+c
  使用pa, pb两指针同时遍历A链表和B链表
  假如a==b, 遍历链表的两指针会同时到达相交的节点
  假如a!=b,pa遍历A链表之后遍历B链表,pb遍历B链表之后遍历A链表
   此时对于A链表来说总长度为: (a+c) + (b+c) —> (a+c+b) + c
   对于B链表来说总长度为: (b+c) + (a+c) —> (b+c+a) + c
   即,pa和pb都遍历了(a+b+c)个节点然后同时到达了相交的节点

时间复杂度O(m+n),m和n分别是链表A,B的长度
空间复杂度O(1)

Go

func getIntersectionNode(headA, headB *ListNode) *ListNode {// 两个链表都不为nil时才会相交if headA == nil || headB == nil {return nil}pa, pb := headA, headB// 如果A和B没有相交的点,最终pa和pb都会为nil, 然后退出for pa != pb {if pa == nil {// A已经遍历完,开始遍历Bpa = headB} else {pa = pa.Next}if pb == nil {// B已经遍历完开始遍历Apb = headA} else {pb = pb.Next}}return pa
}

环形链表II

思路

  1. 判断链表是否有环
  2. 找出环的入口(返回入口节点所在的索引,索引从0开始)

推导过程

初始状态:
在这里插入图片描述
存在双指针,slow、fast初始都指向链表的表头,slow的步长为1,fast的步长为2。
如果链表存在环,则slow与fast 一定会在环内相交 ,因为fast相对于slow的步长为1,即fast在一步一步的接近slow。
则有:
在这里插入图片描述
怎么求环的入口?
 设链表head到环入口的距离为x, 环入口到slow和fast相交点的距离为y,相交点到环入口的距离为z,则有:
在这里插入图片描述
slow和fast同时从链表头开始移动到相交分别移以下距离:
slow:x+y
fast: x+y+n(y+z)
(fast与slow相交之前可能已经在环中转了n圈,一圈距离为y+z)

因为fast的步长为slow的2倍则有:

2(x+y)= x+y+n(y+z)
--> x+y = n(y+z)
--> x = n(y+z)-y
--> x = (n-1)(y+z) + z

x = (n-1)(y+z) + z可以得知,x的长度等距离z加上n-1圈的环的距离((y+z)为一圈环的距离,且(n-1) >= 0)则有:

假如存在两个指针p1, p2, p1指向链表头部向着环入口出发,p2指向slow与fast的相交点向着环入口出发,p1和p2同时开始移动,
则p1与p2的相交点即为环入口。 (即p2从相交点移动到环入口(距离z)后可能会转(n-1)圈环)
在这里插入图片描述

Go

func detectCycle(head *ListNode) *ListNode {slow, fast := head, head// 如果存在环,fast.Next不可能为nilfor fast != nil && fast.Next != nil {// slow的步长为1// fast的步长为2slow = slow.Nextfast = fast.Next.Next// 当slow与fast相等时,说明在环内相交了if slow == fast {// 找出环的入口p1 := headp2 := slow// p1从链表头部开始移动,p2从相交点开始移动,两者相交的点即为环的入口for p1 != p2 {p1, p2 = p1.Next, p2.Next}return p1}}return nil
}

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

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

相关文章

class_19:抽象类(纯虚函数不能被实例化)

#include <iostream>using namespace std;class Teacher{ public:string name;string school;virtual void goinclass() 0;//纯虚函数不能被实例化 抽象类virtual void startclass() 0;//纯虚函数不能被实例化virtual void afterclass() 0;//纯虚函数不能被实例化 };…

Android App开发-简单控件(4)——按钮触控和图像显示

3.4 按钮触控 本节介绍了按钮控件的常见用法&#xff0c;包括&#xff1a;如何设置大小写属性与点击属性&#xff0c;如何响应按钮的点击事件和长按事件&#xff0c;如何禁用按钮又该如何启用按钮&#xff0c;等等。 3.4.1 按钮控件Button 除了文本视图之外&#xff0c;按钮…

IMXULL驱动学习——通过总线设备驱动模型点亮野火开发板小灯【参考韦东山老师教程】

参考&#xff1a;【IMX6ULL驱动开发学习】11.驱动设计之面向对象_分层思想&#xff08;学习设备树过渡部分&#xff09;-CSDN博客 韦东山课程&#xff1a;LED模板驱动程序的改造_总线设备驱动模型 我使用的开发板&#xff1a;野火imx6ull pro 欢迎大家一起讨论学习 实现了总线设…

【探索科技 感知未来】文心一言大模型

【探索科技 感知未来】文心大模型 &#x1f6a9;本文介绍 文心一言大模型是由中国科技巨头百度公司研发的一款大规模语言模型&#xff0c;其基于先进的深度学习技术和海量数据训练而成。这款大模型具备强大的自然语言处理能力&#xff0c;可以理解并生成自然语言&#xff0c;为…

leetcode hot100岛屿数量

本题中要求统计岛屿数量&#xff08;数字1的上下左右均为1&#xff0c;则是连续的1&#xff0c;称为一块岛屿&#xff09;。那么这种类型题都是需要依靠深度优先搜索&#xff08;DFS&#xff09;或者广度优先搜索&#xff08;BFS&#xff09;来做的。这两种搜索&#xff0c;实际…

蓝牙----蓝牙GAP层

蓝牙协议栈----GAP GAP的角色连接过程连接参数 GAP&#xff1a;通用访问配置协议层 gap的角色发现的模式与过程连接模式与过程安全模式与过程 CC2640R2F的GAP层抽象 GAP的角色 Broadcaster 广播电台 -不可连接的广播者。Observer 观察者 -扫描广播者但无法启动连接。Periphe…

降低文件增长和失真的零系数JPEG图像可逆信息隐藏

一、研究概述和意义 随着多媒体技术和网络的迅猛发展&#xff0c;数字媒体的应用越来越广泛。在网络上传输的数字 媒体如音频、文本、视频和图像的内容及数据安全问题也随之而来。伴随着计算机技术发展与普及&#xff0c;数字媒体的机密性、完整性经常受到非法活动的威胁&…

vue中的computed

目录 一&#xff1a;介绍 二&#xff1a;例子演示 一&#xff1a;介绍 在 Vue.js 中&#xff0c;computed 属性是一种特殊类型的属性&#xff0c;它允许你声明依赖于其他数据属性的值。computed 属性的值是通过一个函数计算得出的&#xff0c;这个函数可以在其依赖的数据发生…

深入理解stressapptest

文章目录 一、概述二、安装2.1、源码编译安装2.2、命令行安装2.3、安装确认三、重要参数详解3.1、查询支持的参数3.2、参数说明 四、实例4.1、随机测试&#xff08;默认模式&#xff09;4.2、循环测试4.2、全内存测试 团队博客: 汽车电子社区 一、概述 stressapptest是一款免费…

HCIA-HarmonyOS设备开发认证-2.设备开发入门

目录 HarmonyOS设备开发学习路径一、开发项目与工具介绍1.1、设备开发环境准备1.2、设备开发流程1.3、Huawei DevEco Device Tool 二、OpenHarmony介绍OpenHarmony目录结构详细介绍applications目录详解base目录详解foundation目录详解 OpenHarmony接口分层介绍CMSIS 和 POSIX …

[每日一题] 01.27 - 斐波那契数列

文章目录 打分斐波那契数列 打分 n int(input()) lis list(map(int,input().split())) a sum(lis) - min(lis) - max(lis) print(round(a / (n - 2),2))斐波那契数列 n int(input()) res [] for i in range(n):res.append(int(input()))Max max(res) lis [1,1] for i in…

nodejs学习计划--(七)express框架

express框架 1. express介绍 express 是一个基于 Node.js 平台的极简、灵活的 WEB 应用开发框架&#xff0c;官方网址&#xff1a;https://www.expressjs.com.cn/ 简单来说&#xff0c;express 是一个封装好的工具包&#xff0c;封装了很多功能&#xff0c;便于我们开发 WEB …

Java中的运算符-算数运算符(/,%,+,++)

目录 运算符算数运算符除法 取余运行结果实例测试 的作用的作用测试结果 运算符 算法符号算术运算符&#xff0c;-&#xff0c;*&#xff0c;/&#xff0c;%&#xff0c;&#xff08;自增&#xff09;&#xff0c;–&#xff08;自减&#xff09;赋值运算符扩展赋值运算符&…

Qt WebEngine模块使用(开发环境安装和程序开发)

一、Qt WebEngine Qt WebEngine_hitzsf的博客-CSDN博客 Qt WebEngine模块提供了一个Web浏览器引擎&#xff0c;可以轻松地将万维网上的内容嵌入到没有本机Web引擎的平台上的Qt应用程序中。Qt WebEngine提供了用于渲染HTML&#xff0c;XHTML和SVG文档的C 类和QML类型&#xff…

LeetCode:376.摆动序列

个人主页&#xff1a;仍有未知等待探索-CSDN博客 专题分栏&#xff1a;算法_仍有未知等待探索的博客-CSDN博客 题目链接&#xff1a;376. 摆动序列 - 力扣&#xff08;LeetCode&#xff09; 一、题目 如果连续数字之间的差严格地在正数和负数之间交替&#xff0c;则数字序列称…

146基于matlab的齿轮非线性动力学

基于matlab的齿轮非线性动力学&#xff0c;绘出系统状态变量随参数变化分岔图&#xff0c;绘图参数对应的系统各周期及混沌状态的时间历程图、相轨迹图、Poincare映射图&#xff0c;程序已调通&#xff0c;可直接运行。 146 matlab 齿轮非线性动力学 相图 (xiaohongshu.com)

力扣516. 最长回文子序列

动态规划 思路&#xff1a; 字符串最长回文子序列问题可以转换为原字符串 s 和逆串 s 的最长公共子序列长度问题&#xff0c;具体推断过程可以参考 力扣1312. 让字符串成为回文串的最少插入次数问题变成了求两个字符串最长公共子序列长度问题&#xff0c;具体思路可以参考 力扣…

Win32 PE图标资源提取(ICO图标提取)

最近需要写一个提取EXE或者DLL图标资源的功能, 网上找了很久, 要么功能不好用, 最后结果如下: 1.很多是加载为HICON句柄后转换为图片保存, 全损画质..., 2.后来找了个还能用的, 详见 https://github.com/TortoiseGit/TortoiseGit/blob/master/src/Utils/IconExtractor.cpp …

前端——HTML

目录 文章目录 前言 一.HTML的基本标签 二.HTML标签 1.块级标签 1.1块级标签特征 1.2标题标签 ​编辑 1.3 水平线标签 1.4 段落标签 1.5 无序列表标签 1.6 有序列表标签 1.7 表格标签 1.8层标签 1.9 表单 2. 行级标签 2.1行级标签特征 2.2图像标签 2.3 范围…

Leetcode刷题笔记题解(C++):1971. 寻找图中是否存在路径

思路&#xff1a; 1.建立图集&#xff0c;二维数组&#xff0c;path[0]里面存放的就是与0相连的节点集合 2.用布尔数组来记录当前节点是否被访问过&#xff0c;深度优先会使用到 3.遍历从起点开始能直接到达的点&#xff08;即与起点相邻的点&#xff09;&#xff0c;判断那…