算法通关村第一关-链表白银挑战笔记|公共子节点

news/2024/5/20 17:38:03/文章来源:https://blog.csdn.net/weixin_46585492/article/details/131887066

两个链表公共子节点问题

提示:大家都在做什么? 不做什么。就是等夏天结束


文章目录

  • 两个链表公共子节点问题
  • 前言
  • 题目:
  • 提供四种解决方法的思路:
    • 拿到题目要怎么思考:审题
    • 哈希表或集合实现
    • 使用栈来实现
    • 拼接字符串实现 (组合在一起)
    • 和差双指针实现
  • 总结


前言

提示:会持续量个月,每周至少写两篇博客🤩:

题目:

在这里插入图片描述
这是一道非常经典的链表题目,也属于常考的问题。
已知:

  1. 两个链表
  2. 找到相交点

注意:

  1. 如果两个链表没有交点,返回 null.
  2. 在返回结果后,两个链表仍须保持原有的结构。
  3. 可假定整个链表结构中没有循环。 程序尽量满足 O(n)
  4. 时间复杂度,且仅用 O(1) 内存。

好了题目都说好了,那我们就开始冲吧💕

提供四种解决方法的思路:

  1. 哈希表或集合实现 ⭐
  2. 使用栈确定实现 ⭐⭐
  3. 拼接字符串实现 ⭐⭐⭐
  4. 和差双指针实现 ⭐⭐⭐⭐⭐

拿到题目要怎么思考:审题

单链表的结构:
在这里插入图片描述
链表中的元素以节点的形式进行存储,每个节点都包含了数据和指向下一个节点的引用。
注意一句话:链表中的每个节点只能指向下一个节点,但是可以又多个指针指向同一个节点。【eg:C1节点】
当然如果不知道入手的话:就从头开始想一想常见的数据结构和常见的算法思想
常见的数据结构:
数组、链表、队列、栈、Hash、集合、树、堆。
常见的算法思想:
查找、排序、双指针、递归、迭代、分治、贪心、回溯、动态规划等。
按照这个思绪走下去:

  1. 蛮力呗
    就用遍历(冒泡的思想,一个一个比较)用第一个链表的第一个元素一次和第二个链表的元素作比较,最终找到相同的公共子节点,但是这样的效率太低了【O(N2)】 复杂 排除💣
  2. Hash求解
    当然是把第一个链表的所有元素放道一个Map中,然后需要遍历一遍第二个链表,顺便检测一下是否存在在Hash中,如果存在的话,就找到相同的公共子节点。【这不就可以了吗?❤️,当然了用集合也是不错了:这不又一种方法⭐】
  3. 队和栈试试呗
    队列的话?感觉不太行哈😂。那如果用栈的话,想一想要怎么实现呢?(思考3分钟)
    采用两个栈,分别将链表的元素压入栈中,然后便出栈,边比较元素是否相同。如果相同说明有公共子节点,那么最晚出现的一组相同的节点就是相交的(公共子节点🥰找到了)

梳理完整之后:
(面试小技巧)通过上面的思考,可以直接和面试官说应该可以采用HashMap做,当然使用集合和栈也是可以的。
期待接下来的面试官往下提问。(然后你就可以谈谈具体是怎么解决的)
当然如果你第一次说错了也没关系的,后面发现问题,直接和面试关说就可以。(注意面试是需要交流的过程,如果有疑问,可以提出来)
以下是一些比较经典的解法:

哈希表或集合实现

思路:将第一个链表遍历存入Map中,然后再遍历另一个链表,一边遍历,一边检测是否存在相同的元素,如果存在节点一定可以检测出来。【当然 使用集合的话也是这样的】

/*** 方法1:通过Hash辅助查找** @param pHead1* @param pHead2* @return*/
public static ListNode findFirstCommonNodeByMap(ListNode pHead1, ListNode pHead2) {// 检测参数if (pHead1 == null || pHead2 == null){return null;}// 保存头节点ListNode cur1 = pHead1;ListNode cur2 = pHead2;// 创建一个map 用节点做key   数据做val  ??HashMap<ListNode, Integer> hashMap = new HashMap<>();// 将所有元素存入map中while(cur1 != null){hashMap.put(cur1,cur1.val);cur1 = cur1.next;}// 遍历第二个链表while(cur2 != null){// 如果存在就直接返回公共子节点if (hashMap.containsKey(cur2)){return cur2;}cur2 = cur2.next;}return null;
}
/*** 方法2:通过集合来辅助查找** @param headA* @param headB* @return*/
public static ListNode findFirstCommonNodeBySet(ListNode headA, ListNode headB) {// 集合这里可以想到的set啦🤩(毕竟是存在重复特性的)// 先判断参数  set 不能直接用set 需要使用hashsetSet<ListNode> set = new HashSet<>();// 遍历一个链表 将他存入set集合中while (headA != null) {set.add(headA);headA = headA.next;}// 遍历第二个链表找出 相同的节点while (headB != null) {//  if (!set.add(headB)){//      return headB;//  }  利用set特性if(set.contains(headB)){return headB;}headB = headB.next;}return null;}

使用栈来实现

思路:这里采用两个栈,分别将两个链表存入栈中,然后一边出栈,一边比较,找到最晚出栈的那一组就是这两个链表的公共子节点。不废话了直接上代码😂【冲】


/*** 方法3:通过栈*/
public static ListNode findFirstCommonNodeByStack(ListNode headA, ListNode headB) {// 参数校验/* if(headA == null || headB == null){return null;}*/// 创建连个栈Stack<ListNode> stack1 = new Stack();Stack<ListNode> stack2 = new Stack();// 分别存储两个链表while(headA != null){   // 这里参数校验过  前面的校验就可以省掉stack1.push(headA);headA = headA.next;}while (headB != null){stack2.push(headB);headB = headB.next;}// 出栈 遍历 找到目标ListNode ans = null;while (stack1.size() > 0 && stack2.size() > 0){if (stack1.peek() == stack2.peek()){ans = stack1.pop();stack2.pop();}else {break;}}return ans;
}

拼接字符串实现 (组合在一起)

思路:(也可叫做双指针)
首先我我们先看两个链表:
在这里插入图片描述

以分叉点拆分:
组合在一起(连接)
在这里插入图片描述

从次可以看出 4 开始两个链表就是一样的了,也就是说公共子节点是 4
当然了,如果创建新的链表的话就太浪费时间了,我们可以等链表结束后,调整从下一个链表开始,这样的话思路就来了吧😃,那我就开始装逼了【哈哈】

/*** 方法4:通过序列拼接*/
public static ListNode findFirstCommonNodeByCombine(ListNode pHead1, ListNode pHead2) {// 参数检验if (pHead1 == null || pHead2 == null) {return null;}// 保留头节点ListNode p1 = pHead1;ListNode p2 = pHead2;while(p1 != p2){p1 = p1.next;p2 = p2.next;if (p1 != p2){ // 注意这里if (p1 == null){p1 = pHead2;}if (p2 == null){p2 = pHead1;}}}return p1;}

注意:
if (p1 != p2){ //注意这里 避免死循环【没有公共子节点的情况】

和差双指针实现

思路:
字面意思看是需要使用差和的双指针来解决。具体来说

  1. 分别计算出每个链表的长度 L1 L2
  2. 长的链表先走| L1 - L2 |
  3. 同时遍历,找到第一个相同的节点

话不多说,那就上代码吧🌰


/*** 方法5:通过差值来实现** @param pHead1* @param pHead2* @return*/
public static ListNode findFirstCommonNodeBySub(ListNode pHead1, ListNode pHead2) {// 参数检验if (pHead1 == null || pHead2 == null) {return null;}// 保留头节点ListNode p1 = pHead1;ListNode p2 = pHead2;int l1 = 0;while(p1 != null){p1 = p1.next;l1++;}int l2 = 0;while(p2 != null){p2 = p2.next;l2++;}// 计算出先走的步数int sub = l1 > l2 ? l1 - l2 : l2 - l1;p1 = pHead1;p2 = pHead2;if(l1 > l2){int temp = 0;while(temp < sub){p1 = p1.next; // 此时 p1 已经改变了  所以需要上面的从新复值temp++;}}if(l1 < l2){int temp = 0;while(temp < sub){p2 = p2.next;temp++;}}while (p1 != p2){ // 这里不能用ifp1 = p1.next;p2 = p2.next;}return p1;}

总结

提示:思考的方式很重要 建立习惯

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

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

相关文章

短视频矩阵源码开发搭建分享--多账号授权管理

目录 文章目录 前言 一、矩阵号系统是什么&#xff1f; 二、使用步骤 1.创建推广项目 2.多账号授权 3.企业号智能客服系统 总结 前言 短视频多账号矩阵系统&#xff0c;通过多账号一键授权管理的方式&#xff0c;为运营人员打造功能强大及全面的“矩阵式“管理平台。…

从零构建深度学习推理框架-1 简介和Tensor

源代码作者&#xff1a;https://github.com/zjhellofss 本文仅作为个人学习心得领悟 &#xff0c;将原作品提炼&#xff0c;更加适合新手 什么是推理框架&#xff1f; 深度学习推理框架用于对已训练完成的神经网络进行预测&#xff0c;也就是说&#xff0c;能够将深度训练框…

UE虚幻引擎教程_生成云平台指定路径下的exe文件

市面上大量优秀的游戏都是基于UE制作的&#xff0c;UE虚幻引擎制作的作品可以在windows、mac、linux以及ps4、x-boxone、ios、android甚至是html5等平台上运行。本文介绍了UE虚幻引擎如何生成云平台指定路径下的EXE。 一、云平台会运行打包文件夹下指定路径的EXE文件 但有时候…

【多选框、表格全选】element el-checkbox、el-table

话不多说 先看效果&#xff1a; 多选框&#xff1a; 表格全选&#xff1a; <template><div><div class"titleLabel"><div class"lineStyle"></div>统计部门</div><div style"display: flex"><e…

项目开启启动命令整合

启动RabbitMQ管理插件 1.启动 RabbitMQ 管理插件。 rabbitmq-plugins enable rabbitmq_management rabbitmq-server # 直接启动&#xff0c;如果关闭窗⼝或需要在该窗⼝使⽤其他命令时应⽤就会停⽌ rabbitmq-server -detached # 后台启动 rabbitmq-server start # 启⽤服务 rab…

(二)安装部署InfluxDB

以下内容来自 尚硅谷&#xff0c;写这一系列的文章&#xff0c;主要是为了方便后续自己的查看&#xff0c;不用带着个PDF找来找去的&#xff0c;太麻烦&#xff01; 第 2 章 安装部署InfluxDB 1、linux 安装方式如下 通过包管理工具安装&#xff0c;比如apt 和yum直接下载可执…

springboot()—— 集成redis

1、新建一个springboot项目 2、添加redis依赖包 可以在新建项目的时候就选上 也可以建完项目以后手动导入pom.xml <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </d…

2023年基准Kubernetes报告:6个K8s可靠性失误

云计算日益成为组织构建应用程序和服务的首选目的地。尽管一年来经济不确定性的头条新闻主要集中在通货膨胀增长和银行动荡方面&#xff0c;但大多数组织预计今年的云使用和支出将与计划的相同&#xff08;45%&#xff09;&#xff0c;或高于计划的&#xff08;45%&#xff09;…

装饰模式-扩展系统功能

买了新车后&#xff0c;不少人会对车进行装饰&#xff0c;比如给车贴膜&#xff0c;喷上骚粉的漆等。某天&#xff0c;小李和小张都买了辆车&#xff0c;小李想给车贴膜&#xff0c;小张想给车先喷漆然后再贴膜。现在中的做法是&#xff0c;把车开到改装店&#xff0c;如果要喷…

浏览器调试Android App

浏览器调试Android App 1. 背景2. 调试工具3. 手机设置4. 打开浏览器(edge)5. 连接手机6. 点击inspect 开始调试 1. 背景 在工作中经常会遇到在原生app中嵌套h5&#xff0c; 但是在某些需要在app里面调试的内容&#xff0c; 却没有像chrome开发者工具这样的工具来帮助我们快速…

react 在build读取env 数据

默认会读取.env 文件 npm install dotenv --save npm install dotenv-cli --save-dev例如读取.env.test "build:test": "dotenv -e .env.test react-app-rewired build",.env.test REACT_APP_CURRENTMODE devREACT_APP_Public_Path "https://baid…

[NLP]使用Alpaca-Lora基于llama模型进行微调教程

Stanford Alpaca 是在 LLaMA 整个模型上微调&#xff0c;即对预训练模型中的所有参数都进行微调&#xff08;full fine-tuning&#xff09;。但该方法对于硬件成本要求仍然偏高且训练低效。 [NLP]理解大型语言模型高效微调(PEFT) 因此&#xff0c; Alpaca-Lora 则是利用 Lora…

算法竞赛入门【码蹄集新手村600题】(MT1040-1060)

算法竞赛入门【码蹄集新手村600题】(MT1040-1060&#xff09; 目录MT1041 求圆面积和周长MT1042 求矩形的面积和周长MT1043 椭圆计算MT1044 三角形面积MT1045 平行四边形MT1046 菱形MT1047 梯形MT1048 扇形面积MT1049 三角形坐标MT1050 空间三角形MT1051 四边形坐标MT1052 直角…

Java通过URL对象实现简单爬虫功能

目录 一、URL类 1. URL类基本概念 2. 构造器 3. 常用方法 二、爬虫实例 1. 爬取网络图片&#xff08;简易&#xff09; 2. 爬取网页源代码 3. 爬取网站所有图片 一、URL类 1. URL类基本概念 URL&#xff1a;Uniform Resource Locator 统一资源定位符 表示统一资源定位…

day39-Password Strength Background(密码强度背景)

50 天学习 50 个项目 - HTMLCSS and JavaScript day39-Password Strength Background&#xff08;密码强度背景&#xff09; 效果 index.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name&quo…

Linux 学习记录57(ARM篇)

Linux 学习记录57(ARM篇) 本文目录 Linux 学习记录57(ARM篇)一、外部中断1. 概念2. 流程图框 二、相关寄存器1. GIC CPU Interface (GICC)2. GIC distributor (GICD)3. EXTI registers 三、EXTI 寄存器1. 概述2. 内部框图3. 寄存器功能描述4. EXTI选择框图5. EXTI_EXTICR1 &…

go-zero学习 第六章 分布式事务dtm

go-zero学习 第六章 分布式事务dtm 1 参考文档2 官方示例3 go-zero使用dtm参考代码3.1 go-zero支持dtm 代码操作步骤※3.2 gozerodtm 代码操作步骤 4 注意事项4.1 grpc接口地址※4.2 动态调用过程4.3 dtm的回滚补偿4.4 barrier的空补偿、悬挂等4.5 barrier在rpc中本地事务 1 参…

Volatile关键字详解

Volatile关键字详解 volatile的定义 这个引用JSR中的定义&#xff1a; The Java programming language allows threads to access shared variables (17.1). As a rule, to ensure that shared variables are consistently and reliably updated, a thread should ensure tha…

数据结构【栈和队列】

第三章 栈与队列 一、栈 1.定义&#xff1a;只允许一端进行插入和删除的线性表&#xff0c;结构与手枪的弹夹差不多&#xff0c;可以作为实现递归函数&#xff08;调用和返回都是后进先出&#xff09;调用的一种数据结构&#xff1b; 栈顶&#xff1a;允许插入删除的那端&…

25.3 matlab里面的10中优化方法介绍——Nelder-Mead法(matlab程序)

1.简述 fminsearch函数用来求解多维无约束的线性优化问题 用derivative-free的方法找到多变量无约束函数的最小值 语法 x fminsearch(fun,x0) x fminsearch(fun,x0,options) [x,fval] fminsearch(...) [x,fval,exitflag] fminsearch(...) [x,fval,exitflag,output] fmins…