代码随想录—力扣算法题:07.链表相交. Java版(示例代码与导图详解)

news2024/12/24 21:57:52

版本说明

当前版本号[20230923]。

版本修改说明
20230923初版

07. 链表相交

同:160.链表相交

力扣题目链接

给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。

图示两个链表在节点 c1 开始相交:

img

题目数据 保证整个链式结构中不存在环

注意,函数返回结果后,链表必须 保持其原始结构

示例 1:

img

示例 2:

img

示例 3:

img

思路

简单来说,就是求两个链表交点节点的指针。 这里同学们要注意,交点不是数值相等,而是指针相等

为了方便举例,假设节点元素数值相等,则节点指针相等。

看如下两个链表,目前curA指向链表A的头结点,curB指向链表B的头结点:

image-20230923200507578

我们求出两个链表的长度,并求出两个链表长度的差值,然后让curA移动到,和curB 末尾对齐的位置,如图:

image-20230923200557613

此时我们就可以比较curA和curB是否相同,如果不相同,同时向后移动curA和curB,如果遇到curA == curB,则找到交点。

否则循环退出返回空指针。

代码实现

1、首先,我们需要找到两个链表的长度。我们可以通过遍历链表来实现这一点。在遍历过程中,我们将链表A的长度存储在变量lenA中,将链表B的长度存储在变量lenB中。

	ListNode curA = headA;
        ListNode curB = headB;
        int lenA = 0;
        int lenB = 0;

        while(curA != null){	// 求链表A的长度
            lenA++;
            curA = curA.next;
        }

        while(curB != null){	// 求链表B的长度
            lenB++;
            curB = curB.next;
        }

        curA = headA;
        curB = headB;

2、然后,我们需要确保链表A是较长的链表。如果链表B的长度大于链表A的长度,我们需要交换它们的长度和头节点。这是因为我们在后续的遍历中将从链表A的末尾开始,而从链表B的头部开始。

 // 让curA为最长链表的头,lenA为其长度
        if(lenB > lenA)
        {
            int tmplen = lenA;
            lenA = lenB;
            lenB = tmplen;
            ListNode tmpNode = curA;
            curA = curB;
            curB = tmpNode;
        }

3、接下来,我们需要计算两个链表的长度差。这将用于确定我们需要从链表A的末尾移动到何处,以便与链表B对齐。

 // 求长度差
        int gap = lenA - lenB;

4、然后,我们需要让链表A和链表B在同一起点上(即它们的末尾位置对齐)。我们可以通过从链表A的末尾向前移动lenA - lenB个节点来实现这一点。

// 让curA和curB在同一起点上(末尾位置对齐)
        while(gap-- > 0)
        {
            curA = curA.next;
        }

5、最后,我们需要遍历链表A和链表B,直到找到相同的节点(即交点)。如果找到相同的节点,我们将立即返回该节点。如果我们遍历完两个链表都没有找到交点,我们将返回null。

// 遍历curA 和 curB,遇到相同则直接返回
        while(curA != null)
        {
            if(curA == curB)
            {
                return curA;
            }
            curA = curA.next;
            curB = curB.next;
        }

总结

​ 这段代码的主要功能是找到两个链表的交点。首先,它通过遍历链表来获取链表A和链表B的长度。然后,如果链表B的长度大于链表A的长度,它会交换这两个长度,并交换相应的头节点。接着,它会计算两个链表的长度差,并根据这个长度差从链表A的末尾向前移动相应的节点,使得链表A和链表B在同一起点上。最后,它会遍历链表A和链表B,一旦找到相同的节点,就立即返回该节点。如果遍历完两个链表都没有找到交点,它将返回null。

完整代码:

public class Day09
{
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        ListNode curA = headA;
        ListNode curB = headB;
        int lenA = 0;
        int lenB = 0;

        while(curA != null){
            lenA++;
            curA = curA.next;
        }

        while(curB != null){
            lenB++;
            curB = curB.next;
        }

        curA = headA;
        curB = headB;

        // 让curA为最长链表的头,lenA为其长度
        if(lenB > lenA)
        {
            int tmplen = lenA;
            lenA = lenB;
            lenB = tmplen;
            ListNode tmpNode = curA;
            curA = curB;
            curB = tmpNode;
        }

        // 求长度差
        int gap = lenA - lenB;

        // 让curA和curB在同一起点上(末尾位置对齐)
        while(gap-- > 0)
        {
            curA = curA.next;
        }

        // 遍历curA 和 curB,遇到相同则直接返回
        while(curA != null)
        {
            if(curA == curB)
            {
                return curA;
            }
            curA = curA.next;
            curB = curB.next;
        }

        return null;
    }
}
l)
        {
            if(curA == curB)
            {
                return curA;
            }
            curA = curA.next;
            curB = curB.next;
        }

        return null;
    }
}

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

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

相关文章

C/C++正常血压 2019年12月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析

目录 C/C正常血压 一、题目要求 1、编程实现 2、输入输出 二、解题思路 1、案例分析 三、程序代码 四、程序说明 五、运行结果 六、考点分析 C/C正常血压 2019年12月 C/C编程等级考试一级编程题 一、题目要求 1、编程实现 监护室每小时测量一次病人的血压&#x…

链式二叉树的实现及遍历(C语言版)

目录 1 基本概念 1.1 树的概念 1.2 二叉树的链式表示 1.2.1 "左孩子右兄弟"表示法 1.2.2 "左右子树"表示法 1.2.3 手动构建一棵树 2 树的遍历 2.1 前序遍历/先序遍历 2.2 中序遍历 2.3 后序遍历 2.4 层序遍历 2.4.1 算法思想 ​编辑 2.4.2 带头…

堆向上调整及堆向下调整

个人主页:Lei宝啊 愿所有美好如期而遇 前言: 在堆这一节中,孩子和其父节点有如下关系: 左孩子:left_child parent * 2 1; 右孩子:right_child parent * 2 2; 父节点在计算时,因为兄弟…

【Java 基础篇】Java 接口组成与更新详解

在Java编程中,接口(interface)是一种非常重要的概念。它允许类定义一组抽象方法,这些方法可以在不同的类中实现。接口在Java中起到了重要的角色,被广泛应用于代码的组织和设计中。本文将详细解释Java接口的组成和最新的…

C++ - 红黑树 介绍 和 实现

前言 前面 学习了 AVL树,AVL树虽然在 查找方面始终拥有 O(log N )的极高效率,但是,AVL 树在插入 ,删除等等 修改的操作当中非常的麻烦,尤其是 删除操作,在实现当中细节非常多,在实现上非常难掌控…

3、靶场——Pinkys-Place v3(3)

文章目录 一、获取flag41.1 关于SUID提权1.2 通过端口转发获取setuid文件1.3 运行pinksecd文件1.4 利用nm对文件进行分析1.5 构建payload1.6 Fire 二、获取flag52.1 生成ssh公钥2.2 免密登录ssh2.3 以pinksecmanagement的身份进行信息收集2.4 测试程序/usr/local/bin/PSMCCLI2.…

Vue的详细教程--Vue路由与nodejs

🥳🥳Welcome Huihuis Code World ! !🥳🥳 接下来看看由辉辉所写的关于Vue的相关操作吧 目录 🥳🥳Welcome Huihuis Code World ! !🥳🥳 一.Vue路由是什么 二.使用Vue路由的步骤 1、…

【无标题】显示TIFF格式文件

显示TIF文件 运行结果 package src;import com.sun.media.jai.codec.*;import com.sun.media.jai.codec.FileSeekableStream; import com.sun.media.jai.codec.ImageDecoder; import com.sun.media.jai.codec.ImageCodec; import com.sun.media.jai.codec.TIFFEncodeParam; imp…

2010-2017年WIND分省政府性债务余额面板数据

2010-2017年WIND分省政府性债务余额面板数据 1、时间:2010-2017年 2、指标:债务余额 3、范围:30个省 4、来源:wind 5、指标解释:地方政府债务分为一般债务和专项债务。 一般债务对应的是一般公共预算&#xff0c…

操作系统权限提升(三十)之数据库提权-SQL Server sp_oacreate+sp_oamethod(dba权限)提权

SQL Server sp_oacreate+sp_oamethod(dba权限)提权 sp_oacreate+sp_oamethod介绍 在xp_cmdshell被删除或不能利用是可以考虑利用sp_oacreate,利用前提需要sqlserver sysadmin账户服务器权限为system(sqlserver2019默认被降权为mssql)。sp_oacreate 是一个存储过程,可以…

Kubernetes 部署 nfs-subdir-external-provisioner

概述 官方GitHub及参考文档:GitHub - kubernetes-sigs/nfs-subdir-external-provisioner: Dynamic sub-dir volume provisioner on a remote NFS server. 部署nfs-subdir-external-provisioner提供StorageClass服务 步骤 nfs 服务器准备 /etc/exports # cat /etc/exports…

数据链路层--以太网

文章目录 以太网1. 以太网帧格式2. mac地址与IP地址 代表协议:以太网. 以太网 以太网" 不是一种具体的网络,而是一种技术标准;既包含了数据链路层的内容,也包含了一些物理层的内容。例如:规定了网络拓扑结构,访…

laravel框架 - 消息队列如何使用

业务场景:项目里边有很多视频资源需要上传到抖音资源库,通过队列一条一条上传。 参考实例:发送邮件,仅供参考 (1)创建任务【生成任务类】 在你的应用程序中,队列的任务类都默认放在 app/Jobs 目录下。如果这个目录不存…

一款好用的汇编学习工具【compile explore在线编译调试】

登录网址:Compiler Explorer 然后编写代码如下:可以看到,最左边是源代码,中间是汇编,可以选择编程语言和编译链工具,最右边是打印的输出结果,对于汇编指令可右键会弹出汇编指令的解释说明。

十四、ADDA数模转换

十四、AD&DA转换 介绍XTP2046介绍模块代码 模数转换数模转换 介绍 AD:模数转换,将模拟信号转换为计算机可操作的数字信号DA:数模转换,将数字信号转换为模拟信号 XTP2046 介绍 时序 模块代码 #define XPT2046_VBAT 0xAC /…

大数据学习1.0-Centos8虚拟机安装

1.创建新的虚拟机 2.选择稍后安装OS 3.选择Linux的CentOS8 4.选择安装路径 5.分配20g存储空间 6.自定义硬件 7.分配2g内存 8.分配2核处理器 9.选择镜像位置 10.开启虚拟机安装 推荐密码设置为root

全国职业技能大赛云计算--高职组赛题卷②(容器云)

全国职业技能大赛云计算--高职组赛题卷②(容器云) 第二场次题目:容器云平台部署与运维任务1 Docker CE及私有仓库安装任务(5分)任务2 基于容器的web应用系统部署任务(15分)任务3 基于容器的持续…

洛谷刷题入门篇:分支结构

今天又来了,刷题刷题,我爱刷题,题单链接如下: https://www.luogu.com.cn/training/101#problems 一、【深基1-2】小学数学 N 合一 题目如下:https://www.luogu.com.cn/problem/P2433 题目描述 问题 1 请输出 I lov…

[Linux入门]---git命令行的基本使用

文章目录 1.git使用gitee仓库创建git使用测试ignore文件 1.git使用 git是一款对文件进行版本控制的软件,gitee、github是基于git软件搭建的网站,是可以对代码进行托管的平台;github是国外的网站,访问慢,不稳定&#xf…

Linux学习之Redis使用

搭建Redis服务器 在主机redis64运行redis服务 #安装redis服务 [rootredis64 ~]# yum install -y redis # 启动redis服务并开机启动 [rootredis64 ~]# systemctl enable redis --now # 查看redis端口 [rootredis64 ~]# ss -tnlp | grep redis-server LISTEN 0 128 …