Golang leetcode160相交链表 map 双指针迭代

文章目录

  • 相交链表 leetcode160
    • 暴力求解 map
    • 双指针1
    • 双指针2 巧妙 该部分源于leetcode官方题解

相交链表 leetcode160

由于链表深度不一致,所以不太好使用递归

  • 检测方法 :
    • 相交链表,即两个链表上一个节点的Next指向 同一个地址
    • 先检测同样Val值,再查看地址
      使用map?

同时这里要求我们返回的是相交节点的 Val

暴力求解 map

遍历


func getIntersectionNode(headA, headB *ListNode) *ListNode {//考虑到从第一个节点就相交的情况,设立虚拟头节点DummyHeadA := &ListNode{Next: headA}DummyHeadB := &ListNode{Next: headB}//使用map进行记录var resultA = map[*ListNode]int{}var resultB = map[*ListNode]int{}//遍历两个链表for DummyHeadA.Next != nil || DummyHeadB.Next != nil {if DummyHeadA.Next == nil {resultB[DummyHeadB.Next] = DummyHeadB.Next.ValDummyHeadB = DummyHeadB.Next} else if DummyHeadB.Next == nil {resultA[DummyHeadA.Next] = DummyHeadA.Next.ValDummyHeadA = DummyHeadA.Next} else {resultA[DummyHeadA.Next] = DummyHeadA.Next.ValDummyHeadA = DummyHeadA.NextresultB[DummyHeadB.Next] = DummyHeadB.Next.ValDummyHeadB = DummyHeadB.Next}//检查map中是否记录相交节点if _, ok := resultA[DummyHeadB]; ok {return DummyHeadB}if _, ok := resultB[DummyHeadA]; ok {return DummyHeadA}}return nil
}

双指针1

前面陷入思维误区,相交节点之后两个链表是完全一致的,所以我们可以忽略长链表比短链表长的一部分,
从长度一样的地方开始 两个链表同时遍历,相交节点一定位于同一级

// 双指针
func getIntersectionNode(headA, headB *ListNode) *ListNode {//遍历两链表得到链表长度La := 0Lb := 0curA := headAcurB := headBfor curA != nil {curA = curA.NextLa++}for curB != nil {curB = curB.NextLb++}//将较长的链表偏移到和较短的链表一样长的位置if La > Lb {for diff := La - Lb; diff > 0; diff-- {headA = headA.Next}}if La <= Lb {for diff := Lb - La; diff > 0; diff-- {headB = headB.Next}}//同级每个节点进行比较,相同则为相交节点for headA != nil {if headA == headB {return headA}headA = headA.NextheadB = headB.Next}return nil
}

双指针2 巧妙 该部分源于leetcode官方题解

思路和算法
使用双指针的方法,可以将空间复杂度降至 O(1)O(1)O(1)。

只有当链表 headA headB 都不为空时,两个链表才可能相交。因此首先判断链表 headA headB 是否为空,如果其中至少有一个链表为空,则两个链表一定不相交,返回 null

当链表 headA headB 都不为空时,创建两个指针 pApB,初始时分别指向两个链表的头节点headAheadB ,然后将两个指针依次遍历两个链表的每个节点。具体做法如下:

每步操作需要同时更新指针pA pB

如果指针 pA 不为空,则将指针 pA 移到下一个节点;如果指针 pB 不为空,则将指针 pB 移到下一个节点。

如果指针 pA为空,则将指针 pA 移到链表 headB 的头节点;如果指针 pB 为空,则将指针 pB 移到链表 headA 的头节点。

当指针pApB指向同一个节点或者都为空时,返回它们指向的节点或者 null

func getIntersectionNode(headA, headB *ListNode) *ListNode {if headA == nil || headB == nil {return nil}pa, pb := headA, headBfor pa != pb {if pa == nil {pa = headB} else {pa = pa.Next}if pb == nil {pb = headA} else {pb = pb.Next}}return pa
}

下面提供双指针方法的正确性证明。考虑两种情况,第一种情况是两个链表相交,第二种情况是两个链表不相交。

  • 情况一:两个链表相交

链表headAheadB 的长度分别是 mn。假设链表 headA 的不相交部分有 a 个节点,链表 headB 的不相交部分有 b 个节点,两个链表相交的部分有 c 个节点,则有 a+c=ma+c=ma+c=m,b+c=nb+c=nb+c=n

如果 a=b,则两个指针会同时到达两个链表相交的节点,此时返回相交的节点;

如果 a≠b ,则指针 pA 会遍历完链表 headA,指针 pB 会遍历完链表 headB,两个指针不会同时到达链表的尾节点,然后指针 pA 移到链表 headB 的头节点,指针 pB 移到链表 headA 的头节点,然后两个指针继续移动,在指针 pA 移动了 a+c+b 次、指针 pB 移动了 b+c+a 次之后,两个指针会同时到达两个链表相交的节点,该节点也是两个指针第一次同时指向的节点,此时返回相交的节点。

  • 情况二:两个链表不相交

链表 headAheadB的长度分别是 mn 。考虑当 m=n m≠n 时,两个指针分别会如何移动:

如果 m=n ,则两个指针会同时到达两个链表的尾节点,然后同时变成空值 null,此时返回 null

如果 m≠n,则由于两个链表没有公共节点,两个指针也不会同时到达两个链表的尾节点,因此两个指针都会遍历完两个链表,在指针 pA 移动了m+n次、指针pB移动了n+m次之后,两个指针会同时变成空值 null,此时返回 null

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

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

相关文章

在页面中获取iframe中window对象,在iframe中获取上级window对象

1 在页面中获取iframe中window对象 const iframedocument.getElementById("myiframe") iframe.contentWindow 获取iframe中的window对象 iframe.contentDocument 获取iframe中的document对象2 在iframe中获取上级window对象 window.parent 获取上一级的windo…

<设计模式修炼>模板方法模式的使用场景和注意事项学习

介绍 模板方法模式&#xff08;Template Method Pattern&#xff09;&#xff0c;又叫模板模式(Template Pattern)&#xff0c;在一个抽象类公开定义了执行它的方法的模板。它的子类可以按需要重写方法实现&#xff0c;但调用将以抽象类中定义的方式进行。 2) 简单说&#xff…

Proxy 与 defineProperty 的理解、区别、优势、劣势

一、Object.defineProperty() 文档&#xff1a;Object.defineProperty() - JavaScript | MDN 作用&#xff1a;对一个对象进行操作的方法。可以为一个对象增加一个属性&#xff0c;同时也可以对一个属性进行修改和删除。 它是在 ES5 中引入的&#xff0c;使用了 getter 和 s…

P10 RV1126推流项目——ffmpeg输出参数初始化

前言 从本章开始我们将要学习嵌入式音视频的学习了 &#xff0c;使用的瑞芯微的开发板 &#x1f3ac; 个人主页&#xff1a;ChenPi &#x1f43b;推荐专栏1: 《C_ChenPi的博客-CSDN博客》✨✨✨ &#x1f525; 推荐专栏2: 《Linux C应用编程&#xff08;概念类&#xff09;_C…

1.3 金融数据可视化

跳转到根目录&#xff1a;知行合一&#xff1a;投资篇 已完成&#xff1a; 1.1 编程基础   1.1.1 投资-编程基础-numpy   1.1.2 投资-编程基础-pandas 1.2 金融数据处理 1.3 金融数据可视化 文章目录 1. 金融数据可视化1.1. matplotlib1.1.1. 沪深300走势图1.1.2. 日线均线…

C++算法学习五.二叉树(1)

1.二叉树理论基础 二叉树的种类&#xff1a; 满二叉树&#xff1a;一棵二叉树只有度为0的结点和度为2的结点&#xff0c;并且度为0的结点在同一层上&#xff0c;则这棵二叉树为满二叉树。深度为k&#xff0c;总共有2的k次幂-1个节点。 完全二叉树&#xff1a;在完全二叉树中…

LeetCode 27.移除元素

移除元素 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出新…

公司新招了个字节拿36K的人,让我见识到了什么才是测试扛把子......

5年测试&#xff0c;应该是能达到资深测试的水准&#xff0c;即不仅能熟练地开发业务&#xff0c;而且还能熟悉项目开发&#xff0c;测试&#xff0c;调试和发布的流程&#xff0c;而且还应该能全面掌握数据库等方面的技能&#xff0c;如果技能再高些的话&#xff0c;甚至熟悉分…

[Javaweb/LayUI/上机考试作业/开源]学生/图书/课程/仓库等管理系统六合一基础功能通用模板

展示 考试要求 给定用户表和六张图书/教师/顾客/仓库....的表&#xff08;随机给每人抽选&#xff09;&#xff0c;要求实现用户登录注册&#xff0c;异步更新&#xff0c;对物品增删改查&#xff0c;精确/模糊查询等。 环境 tomcat 9 mysql 8 java 17 项目结构 项目类图 写前…

Java amr格式转mp3格式

1.问题描述 微信返回的语音是amr格式的&#xff0c;浏览器不能直接使用&#xff0c;所以需要转为mp3 注意&#xff1a;不能直接使用IO流转为mp3&#xff0c;不然H5还是用不了。转换之后的语音只能在播放器上播放&#xff0c;内里的文件格式其实还是amr 2.使用以下方式转换 音…

自制c++题目《抽象类与虚函数》

1.题目要求&#xff1a;构建一个抽象类car&#xff0c;由两个基类track和bike 继承&#xff0c;而它们共同的继承者是people类&#xff0c;要求构建上述类并撰写可辨别的语句 2.题解《抽象类与虚函数》的答案 王赫辰/c语言 - Gitee.com

tmux用法

tmux 安装 tmux sudo apt install tmux 运行 tmux tmux 退出 tmux exit 分离 tmux ctrl b, d 查看 tmux tmux ls 恢复 tmux tmux at -t <ID> 配置 tmux 在 ~/ 下面建一个 .tmux.conf 文件 set -g history-limit 9999 # 设置历史缓存长度 查看历史输出 …

Python学习笔记(五)函数、异常处理

目录 函数 函数的参数与传递方式 异常处理 函数 函数是将代码封装起来&#xff0c;实现代码复用的目的 函数的命名规则——同变量命名规则&#xff1a; 不能中文、数字不能开头、不能使用空格、不能使用关键字 #最简单的定义函数 user_list[] def fun(): #定义一个函数&…

Python正则表达式急速入门~正则居然这么容易掌握!

正则表达式在程序开发中会经常用到&#xff0c;比如数据&#xff08;格式&#xff09;验证、替换字符内容以及提取字符串内容等等情况都会用到&#xff0c;但是目前许多开发人员对于正则表达式只是处于了解或者是基本会用的阶段。一旦遇到大批量使用正则表达式的情况&#xff0…

Python初探:从零开始的编程奇妙之旅

一、Python是什么 Python是一门多用途的高级编程语言&#xff0c;以其简洁、易读的语法而脱颖而出。在深度学习领域&#xff0c;Python扮演着至关重要的角色。其丰富的科学计算库&#xff08;如NumPy、Pandas、Matplotlib&#xff09;和强大的深度学习框架&#xff08;如Tenso…

xshell设置终端类型为xterm-256color (解决oh-my-tmux颜色失真问题)

文章目录 问题描述解法效果检验 问题描述 在xshell远程连接服务器时&#xff0c;tmux色彩有问题&#xff08;tmux配置为Oh my tmux&#xff09;&#xff0c;如下&#xff1a; 这色彩明显是8位的色彩。 现在终端的标配就是类型为 xterm-256color&#xff0c;其支持256位的真彩…

CSU计算机学院2021年C语言期末题目思路分享(后两道题)

文章目录 E: 实数相加——大数加法的拓展原题题目描述输入输出样例输入样例输出 题目思路实现步骤代码和注释 F: 谍影寻踪——链表的思想和运用原题题目描述输入输出样例输入样例输出 题目思路 一点感想 E: 实数相加——大数加法的拓展 原题 题目描述 C语言就要期末考试了&a…

【操作系统习题】存储器与虚拟存储器

存储器 一、单选题 每次分配时总是从低地址到高地址顺序查找空闲区表&#xff0c;找到第一个能满足作业长度要求的空闲区&#xff0c;此种分配算法称为&#xff08;&#xff09; D A、最坏适应分配算法 B、随机适应分配算法 C、最优适应分配算法 D、首次适应分配算法一台计算…

深入探究:使用大型AI模型的实战指南

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 在今天的技术领域&#xff0c;大型AI模型已成为…

2下载Spring,第一个Spring程序+引用Log4j2

https://www.yuque.com/dujubin/ltckqu/kipzgd#&#xff0c;注意的是&#xff0c;现在&#xff08;202401&#xff09;SpringFramework从release搬到了snapshot下&#xff0c;在这下面找到6.0.2下载. 下载后解压到文件夹&#xff0c;整个框架包含非常多jar包。 然后就可以在p…