每日一题——LeetCode160.相交链表

news2024/9/23 5:28:29

个人主页:白日依山璟

专栏:Java|数据结构与算法|每日一题


文章目录

    • 1. 题目描述
      • 示例1:
      • 示例2:
      • 提示:
    • 2. 思路
    • 3. 代码

1. 题目描述

给你两个单链表的头节点 headAheadB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null

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

img

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

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

自定义评测:

评测系统 的输入如下(你设计的程序 不适用 此输入):

  • intersectVal - 相交的起始节点的值。如果不存在相交节点,这一值为 0
  • listA - 第一个链表
  • listB - 第二个链表
  • skipA - 在 listA 中(从头节点开始)跳到交叉节点的节点数
  • skipB - 在 listB 中(从头节点开始)跳到交叉节点的节点数

评测系统将根据这些输入创建链式数据结构,并将两个头节点 headAheadB 传递给你的程序。如果程序能够正确返回相交节点,那么你的解决方案将被 视作正确答案

示例1:

img

输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,6,1,8,4,5], skipA = 2, skipB = 3

输出:Intersected at ‘8’
解释:相交节点的值为 8 (注意,如果两个链表相交则不能为 0)。
从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,6,1,8,4,5]。
在 A 中,相交节点前有 2 个节点;在 B 中,相交节点前有 3 个节点。
— 请注意相交节点的值不为 1,因为在链表 A 和链表 B 之中值为 1 的节点 (A 中第二个节点和 B 中第三个节点) 是不同的节点。换句话说,它们在内存中指向两个不同的位置,而链表 A 和链表 B 中值为 8 的节点 (A 中第三个节点,B 中第四个节点) 在内存中指向相同的位置。

示例2:

img

输入:intersectVal = 0, listA = [2,6,4], listB = [1,5], skipA = 3, skipB = 2
输出:null
解释:从各自的表头开始算起,链表 A 为 [2,6,4],链表 B 为 [1,5]。
由于这两个链表不相交,所以 intersectVal 必须为 0,而 skipA 和 skipB 可以是任意值。
这两个链表不相交,因此返回 null 。

提示:

  • listA 中节点数目为 m
  • listB 中节点数目为 n
  • 1 <= m, n <= 3 * 104
  • 1 <= Node.val <= 105
  • 0 <= skipA <= m
  • 0 <= skipB <= n
  • 如果 listAlistB 没有交点,intersectVal0
  • 如果 listAlistB 有交点,intersectVal == listA[skipA] == listB[skipB]

题目链接

2. 思路

  1. 计算两个链表的长度的差值

    1. 定义len1表示链表A的长度,定义len2表示链表B的长度

      int len1 = 0;
      int len2 = 0;
      
    2. 定义指针plpspl永远指向最长的链表,ps永远指向最短的链表。(假设链表A是最长的链表)

      ListNode pl = headA; // 永远指向最长的链表
      ListNode ps = headB; // 永远指向最短的链表
      
    3. 计算链表A和链表B的长度

      while (pl != null) {
          len1++;
          pl = pl.next;
      }
      while (ps != null) {
           len2++;
           ps = ps.next;
      }
      
    4. plps分别指两个链接的头节点

      pl = headA;
      ps = headB;
      
    5. 计算链表的差值,如果链表A的长度小于链表B的长度,则交换plps的指向的头节点,重新计算链表的差值。

      int len = len1 - len2;
      if (len < 0) {
      	pl = headB;
      	ps = headA;
      	len = len2 - len1;
      }
      
  2. 让长的链表先移动len步。

    image-20231224170247959

    while (len != 0) {
    	pl = pl.next;
        len--;
    }
    
  3. 同时移动,相遇之后就是相交的节点

    image-20231224170324004

    while (pl != ps) {
    	pl = pl.next;
    	ps = ps.next;
    }
    
  4. 返回pl

    return pl;
    

运行结果:

image-20231224165117355

这样就完了?链表一定可以相交?如果链表为空呢?null != null为假,直接返回pl,而pl正好为空

image-20231224170855318

解决方法:判断链表是否为空。

while(pl != null && ps != null &&  pl != ps) {
	pl = pl.next;
	ps = ps.next;
}
if(pl == ps && pl == null) {
	return null;
}
return pl;

3. 代码

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        int len1 = 0;
        int len2 = 0;

        ListNode pl = headA;
        ListNode ps = headB;

        while (pl != null) {
            len1++;
            pl = pl.next;
        }
        while (ps != null) {
            len2++;
            ps = ps.next;
        }
        pl = headA;
        ps = headB;
        int len = len1 - len2;
        if (len < 0) {
            pl = headB;
            ps = headA;
            len = len2 - len1;
        }
        while (len != 0) {
            pl = pl.next;
            len--;
        }
        
        while(pl != null && ps != null &&  pl != ps) {
	        pl = pl.next;
	        ps = ps.next;
         }
        if(pl == ps && pl == null) {
	        return null;
        }

        return pl;
    }
}

运行结果:

image-20231224171435619

在这里插入图片描述

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

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

相关文章

3.docker 安装失败

1、错误描述 2、报错前操作 ① 安装yum工具 yum install -y yum-utils \device-mapper-persistent-data \lvm2 --skip-broken ② 更新本地镜像源 # 设置docker镜像源 yum-config-manager \--add-repo \https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo…

改善OEE的关键:从反应性维护向预测性维护转变

科技的进步正在对企业的日常运营模式产生影响。许多制造企业已经采用了自动化生产流程&#xff0c;这不仅提高了产品质量&#xff0c;还简化了设备维护流程&#xff0c;并使得制造企业的设备维护方式从反应性维护转变为预测性维护。人们发现&#xff0c;设备维护方式的转变显著…

8.16 PowerBI系列之DAX函数专题-客户购买商品关联度的分析

需求 实现 1 客户数 countrows(values(sales[customerkey]))2 同时购买A和B的客户数 var A_cust values(sales[customerkey]) // var b_cust calculatetable(values(sales[customerkey]),usereletionship(product b[productkey],sales[productkey]),//激活虚拟关系all(p…

Java 基础学习(十七)多线程高级

1 多线程并发安全&#xff08;续&#xff09; 1.1 synchronized方法 1.1.1 synchronized方法 与同步代码块不同&#xff0c;同步方法将子线程要访问的代码放到一个方法中&#xff0c;在该方法的名称前面加上关键字synchronized即可&#xff0c;这里默认的锁为this&#xff0…

国外加固Appdome环境检测与绕过

文章目录 前言第一部分&#xff1a;定位检测逻辑的通用思路1. 通过linux“一切皆文件”思路定位2. 分析现有检测软件猜测可能检测点3. 通过正向开发思路定位4. 通过activity及弹窗定位 第二部分&#xff1a;检测结果展示整体流程1. Jni反射调用doDispath完成广播发送2. NativeB…

Redis案例实战之Bitmap、Hyperloglog、GEO

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring源码、JUC源码、Kafka原理、分布式技术原理、数据库技术&#x1f525;如果感觉博主的文章还不错的…

数据安全技术措施

目录 数据安全技术的控制点 数据完整性 数据保密性 数据备份与恢复 数据安全技术的控制点 数据完整性 数据保密性 数据备份与恢复 ~over~

开发利器——C语言必备实用第三方库

​ 对于广大C语言开发者来说&#xff0c;缺乏类似C STL和Boost的库会让开发受制于基础库的匮乏&#xff0c;也因此导致了开发效率的骤降。这也使得例如libevent这类事件库&#xff08;基础组件库&#xff09;一时间大红大紫。 今天&#xff0c;码哥给大家带来一款基础库&#…

Mybatis如何兼容各类日志?

文章目录 适配器模式日志模块代理模式1、静态代理模式2、JDK动态代理 JDBC Logger总结 Apache Commons Logging、Log4j、Log4j2、java.util.logging 等是 Java 开发中常用的几款日志框架&#xff0c;这些日志框架来源于不同的开源组织&#xff0c;给用户暴露的接口也有很多不同…

Ascon加解密算法分析

参数定义 加密架构图 整个过程是在处理320bits的数据&#xff0c;所以在最开始需要对原始的数据进行一个初始化&#xff0c;获得320bits的数据块&#xff0c; 图里看到的pa和pb都是在做置换&#xff08;对320bits的数据进行一个置换&#xff09; 置换&#xff08;Permutation&…

04|提示工程(上):用少样本FewShotTemplate和ExampleSelector创建应景文案

04&#xff5c;提示工程&#xff08;上&#xff09;&#xff1a;用少样本FewShotTemplate和ExampleSelector创建应景文案 当你用 print 语句打印出最终传递给大模型的提示时&#xff0c;一切就变得非常明了。 您是一位专业的鲜花店文案撰写员。 对于售价为 50 元的 玫瑰 &…

c++使用强制转换类型

对于c中的强制转换&#xff0c;这里主要是讲解的是父类与子类之间的类型强制转换。对于以下的代码中&#xff0c;主要是父类Monkey和子类Man之间的成员函数的调用。 // 这是父类 class Monkey { public&#xff1a; // 定义一个纯虚函数 virtual void printFunc() { qDeb…

udp多播/组播那些事

多播与组播 多播&#xff08;multicast&#xff09;和组播&#xff08;groupcast&#xff09;是相同的概念&#xff0c;用于描述在网络中一对多的通信方式。在网络通信中&#xff0c;单播&#xff08;unicast&#xff09;是一对一的通信方式&#xff0c;广播&#xff08;broad…

智能优化算法应用:基于食肉植物算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于食肉植物算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于食肉植物算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.食肉植物算法4.实验参数设定5.算法结果6.…

算法学习系列(十一):KMP算法

目录 引言一、算法概念二、题目描述三、思路讲解三、代码实现四、测试 引言 这个KMP算法就是怎么说呢&#xff0c;就是不管算法竞赛还是找工作笔试面试&#xff0c;都是非常爱问爱考的&#xff0c;其实也是因为这个算法比较难懂&#xff0c;其实就是很难&#xff0c;所以非常个…

不同参数规模大语言模型在不同微调方法下所需要的显存总结

原文来自DataLearnerAI官方网站&#xff1a; 不同参数规模大语言模型在不同微调方法下所需要的显存总结 | 数据学习者官方网站(Datalearner)https://www.datalearner.com/blog/1051703254378255 大模型的微调是当前很多人都在做的事情。微调可以让大语言模型适应特定领域的任…

Vue在页面上添加水印

第一步&#xff1a;在自己的项目里创建一个js文件&#xff1b;如图所示我在在watermark文件中创建了一个名为waterMark.js文件。 waterMark.js /** 水印添加方法 */ let setWatermark (str1, str2) > {let id 1.23452384164.123412415if (document.getElementById(id) …

数据库01_增删改查

1、什么是数据&#xff1f;什么是数据库&#xff1f; 数据&#xff1a;描述事物的符号记录称为数据。数据是数据库中存储的基本对象。数据库&#xff1a;存放数据的仓库&#xff0c;数据库中可以保存文本型数据、二进制数据、多媒体数据等数据 2、数据库的发展 第一阶段&…

H266/VVC帧内预测编码技术概述

预测编码技术 预测编码&#xff08;Prediction Coding&#xff09;是指利用已编码的一个或多个样本值&#xff0c;根据某种模型或方法&#xff0c;对当前的样本值进行预测&#xff0c;并对样本真实值和预测值之间的差值进行编码。 视频中的每个像素看成一个信源符号&#xff…

MFC读取文件数据,添加信息到列表并保存到文件

打开并读取文件信息 添加&#xff1a; BOOL infoDlg::OnInitDialog() {CDialogEx::OnInitDialog();// TODO: 在此添加额外的初始化AfxMessageBox("欢迎查看学生信息");SetList();return TRUE; // return TRUE unless you set the focus to a control// 异常: OCX 属…