数据结构习题-- 相交链表

news2025/2/24 7:02:25

数据结构习题-- 相交链表

给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null
在这里插入图片描述
如上图,返回c1结点
注意:这两个链表非环形

方法:集合

分析

由题找到两个链表最先相交的部分,我们可以先遍历一个链表,然后将其每个节点存入集合,然后再遍历另一个链表,每次遍历并判断,该元素是否在集合当中

代码

public class intersectedList {
// 定义结点
    class ListNode{
        int val;
        ListNode next;

        public ListNode(int val) {
            this.val = val;
            next = null;
        }
    }
    public class Solution {
        public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
            HashSet<ListNode> hashSet = new HashSet<>();
            // 遍历链表A并把其每个节点存储在集合当中
            ListNode tempA = headA;
            while (tempA != null){
                hashSet.add(tempA);
                tempA = tempA.next;
            }
            // 遍历链表B,每一个节点判断是否在集合当中,如果在就返回该结点
            ListNode tempB  = headB;
            while (tempB != null){
                if (hashSet.contains(tempB)){
                    return tempB;
                }
                tempB = tempB.next;
            }
            return null;
        }
    }
}

方法:双指针(推荐)

分析

首先我们知道,一但两条链表相交,那么相交部分后都是相同的
那么如果我们从后面往前看每个结点都是相同的,找到第一个相同的点,就是题目中的点
如: 123654
xxxxxxx2654
两条字符串,x表示占位,我们发现从后面往前看,654是公共的部分,而对于一长一短两条链表,公共部分的最大长度最多只能是短的那条链表,我们只需要从短链表开始的位置,和长链表对应的位置一一比较就行,在上述例子中,我们就应该从长链表的3开始,而短链表从2开始,这样如果相同的话,其后面部分长度是相同的

而长链表的1,2绝对不可能是公共的交点,但是在实际处理中,我们不可能不遍历就知道链表长度,所以通过 把一条链表 A 和另外一条链表 B拼接,就能实现对齐,一条拼接为 A + B ,另一条为 B + A,这样就可以实现长度相同
A + B:123654 / 2654
B + A:2654 / 123654
其中的 / 表示把A,B分隔开的一个标识
A + B:123654 / 2654
B + A:2654 / 123654
如上,在非加粗的部分是不可能有相同点的,还是那个原因,因为如果是交点,其后面应该完全一样,但是其后面长度不相同,而到加粗部分就是真正的比较部分
在这里插入图片描述
在这里插入图片描述

代码

package LinkList;

public class intersectedListPlus {
    class ListNode{
        int val;
        ListNode next;

        public ListNode(int val) {
            this.val = val;
            next = null;
        }
    }
    public class Solution {
        public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
            ListNode aBegin = headA;
            ListNode bBegin = headB;
            // 因为最多只变轨两次,设置变量控制变轨次数
            int changeNum = 0;
            // 因为一个是 A + B,一个是 B + A
            // 最后它们达到的结尾是相同的,所以当它们到最后肯定是一起为 null
            // 而因为A B链表的长度可能不同所以不能把循环条件设置为 其中一个为null
            while (aBegin != null && bBegin != null){
                // 判断两个结点是否相同,相同就返回
                if (aBegin == bBegin){
                    return aBegin;
                }
                // 更新结点
                aBegin = aBegin.next;
                bBegin = bBegin.next;
                // 如果变轨次数小于2,且此时aBegin达到 null时,将其设置 到headB,完成变轨拼接
                if (aBegin == null && changeNum < 2){
                    aBegin = headB;
                    changeNum++;
                }
                // 如果变轨次数小于2,且此时bBegin达到 null时,将其设置 到headA,完成变轨拼接
                if (bBegin == null && changeNum < 2){
                    bBegin = headA;
                    changeNum++;
                }
            }
            return null;
        }

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

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

相关文章

大型网站系统架构演化实例_7.使用NoSQL和搜索引擎

1.使用NoSQL和搜索引擎 随着网站业务越来越复杂&#xff0c;对数据存储和检索的需求也越来越复杂&#xff0c;网站需要采用一些非关系数据库技术如NoSQL和非数据库查询技术如搜索引擎。NoSQL和搜索引擎都是源自互联网的技术手段&#xff0c;对可伸缩的分布式特性具有更好的支持…

MyBatis使用PageHelper分页插件

1、不使用PageHelper分页插件 模块名&#xff1a;mybatis-012-page CarMapper接口package org.example.mapper;import org.apache.ibatis.annotations.Param; import org.example.pojo.Car;import java.util.List;public interface CarMapper {/*** 分页查询* param startInd…

vue 下载文件 处理后台返回的文件流

1. 下载文件很常见&#xff0c;下载成各种格式的也很常见&#xff0c;本质就是后台返回一个文件流&#xff0c;我们前端去处理一下就行&#xff0c;但是如果因为某些条件&#xff0c;没有返回文件流&#xff0c;返回告诉你&#xff0c;文件出现错误了&#xff0c;那我们就需要把…

使用示例解释.NET中的Mocking是什么?

让我们踏上探索.NET软件开发中Mocking概念的旅程&#xff0c;让我们深入了解Mocking是多么简单易懂、易于访问。请与我一起穿越这个主题&#xff0c;我将涵盖以下内容&#xff1a; 理解Mocking&#xff1a;为何它对于构建强大的测试策略至关重要。探索一些最常见的Mocking库&a…

学习Rust的第11天:模块系统

Today we are taking a look at the module system of rust. We can use this to manage growing projects and keep track of what modules is stored where… 今天我们来看看Rust的模块系统。我们可以使用它来管理不断增长的项目&#xff0c;并跟踪 modules 存储在何处。 Rus…

mysql四种引擎区别

MySQL 提供了多种不同的数据库引擎&#xff0c;其中最常见的有 MyISAM、InnoDB、MEMORY 和 BLACKHOLE。这四个引擎分别有以下特点&#xff1a; 1. MyISAM MyISAM 是 MySQL 的默认引擎。它对于只有较少的修改、大量读取的应用场景具有良好的性能。它不支持事务处理&#xff0c;也…

如何查看微信公众号发布文章的主图,如何看微信文章的主图,怎么才能拿到主图

如何查看&#xff0c;微信公众号发布文章的主图&#xff0c;如何看微信文章的主图 起因是这样的&#xff0c;当我看到一篇文章的时候&#xff0c;他的主图很漂亮&#xff0c;但是&#xff0c;正文里没有&#xff0c;而我又想看到&#xff0c;并且使用这张图片&#xff0c;该怎么…

社交媒体数据恢复:BF Messager

BF Messenger 数据恢复方法 一、前言 BF Messenger&#xff08;BF加密聊天软件&#xff09;是一款基于布尔式循环移位加密算法的聊天应用程序。它使用对称密钥加密技术&#xff0c;用户可以在安全的环境下进行私密聊天。除此之外&#xff0c;该应用还具有防截屏、应用锁屏、密…

使用 Docker 部署 SurveyKing 调查问卷系统

1&#xff09;SurveyKing 介绍 SurveyKing 是一款功能强大、操作简便的开源问卷系统。它不仅满足了用户对问卷调查的基本需求&#xff0c;还提供了丰富的逻辑设置和灵活的问题设置&#xff0c;使得问卷制作更加智能化和个性化。此外&#xff0c;SurveyKing 还具有快速部署和安全…

gin框架提高篇(四)

参数校验&#xff08;一&#xff09; uuid包&#xff1a;https://github.com/satori/go.uuid 因为作者更改了参数限制&#xff0c;导致会出问题 → 问题解决 package mainimport ("fmt""github.com/gin-gonic/gin""github.com/go-playground/validato…

STL容器搜索:当直接访问STL容器时,如何执行有效和正确的搜索?

在访问STL容器时进行搜索 一、简介二、std::vector, std::deque, std::list三、std::map, std::multimap, std::set, std::multiset四、std::string六、总结 一、简介 本文主要了解如何在直接访问c容器时高效地进行搜索。在STL容器中搜索&#xff0c;要牢记一个原则&#xff1…

禾赛面经分享

前言 禾赛的linux开发工程师&#xff08;实习&#xff09;&#xff0c;base是上海&#xff0c;以下是面试遇到的一些问题。 目录 前言题目与答案C语言部分嵌入式相关手撕题 题目与答案 C语言部分 static关键字的作用 static修饰局部变量时&#xff1a;①改变了其存储位置&…

基础知识集合

https://blog.csdn.net/sheng_q/category_10901984.html?spm1001.2014.3001.5482 epoll 事件驱动的I/O模型&#xff0c;同时处理大量的文件描述符 内核与用户空间共享一个事件表&#xff1a;监控的文件描述符以它们的状态&#xff0c;当状态变化&#xff0c;内核将事件通知给…

【分治】Leetcode 库存管理 III

题目讲解 LCR 159. 库存管理 III 本题的含义就是让求出最小的k个数 算法讲解 class Solution { public:void my_qsort(vector<int>& nums, int l, int r){if(l > r) return ;int i l, left l-1, right r1;int key nums[rand() % (r - l 1) l];//完成分三…

大数据真题讲解系列——拼多多数据分析面试题

拼多多数据分析面试题&#xff1a;连续3次为球队得分的球员名单 问题&#xff1a; 两支篮球队进行了激烈的比赛&#xff0c;比分交替上升。比赛结束后&#xff0c;你有一个两队分数的明细表&#xff08;名称为“分数表”&#xff09;。表中记录了球队、球员号码、球员姓名、得…

hv第一坑:定时器

错误代码 重试策略&#xff1a;一次延迟1s,最长30s直至事件成功。 int try_count 0;//do something if(not success)m_loop->setTimerInLoop((try_count > 30 ? 30: try_count) *1000 , cb, INFINITE, 0x100);表现现象 cpu 爆了内存爆了 总结原因 hv内部代码bug&…

Maven通过flatten-maven-plugin插件实现多模块版本统一管理

正文 起因是公司开始推代码版本管理的相关制度&#xff0c;而开发过程中经常使用多模块构建项目&#xff0c;每次做版本管理时都需要对每个模块及子模块下的pom文件中parent.version和模块下依赖中的version进行修改&#xff0c;改的地方非常多&#xff0c;且非常容易漏。为此…

如何用Python构建一个生产级别的电影推荐系统 - 机器学习手册

构建项目是彻底学习概念并发展必要技能的最有效方式之一。 项目使您沉浸在现实世界的问题解决中&#xff0c;巩固您的知识&#xff0c;并培养批判性思维、适应能力和项目管理专业知识。 本指南将带您逐步构建一个根据用户喜好量身定制的电影推荐系统。我们将利用一个庞大的包…

20240419,继承,多态

土豆的老家陕西安康&#xff01;怪舒服的咯&#xff0c;广西一眼望去全是房子啦&#xff0c;小时候一眼开敞水田再也回不来啦 目录 五&#xff0c;继承 5.1 基本语法 5.2 继承方式 5.3 继承中的对象模型 5.4 构造和析构顺序 5.5 同名成员处理 5.6 同名静态成员处理 5.…

c#+unity基础

序列化&#xff1a; [SerializeField]&#xff0c;点不出来&#xff0c;只能在面板上显示绑定游戏物体 //公有隐藏 特有函数 特有函数&#xff1a;不需要调用&#xff0c;自动执行 Awake最先执行->OnEable 面向对象思想 面向对象思想&#xff1a;分为具体对象和抽象对…