【每日一题】LeetCode160.相交链表

news2025/1/27 12:35:11

个人主页:白日依山璟

专栏: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/1338708.html

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

相关文章

【PTA】L1-32 Left-pad (C++)

题目链接&#xff1a;L1-032 Left-pad 题目要求&#xff1a; 根据新浪微博上的消息&#xff0c;有一位开发者不满NPM&#xff08;Node Package Manager&#xff09;的做法&#xff0c;收回了自己的开源代码&#xff0c;其中包括一个叫left-pad的模块&#xff0c;就是这个模块…

Mysql实时数据同步工具Alibaba Canal 使用

目录 Mysql实时数据同步工具Alibaba Canal 使用Canal是什么&#xff1f;工作原理重要版本更新说明 环境准备安装Canalwindow Java : Canal Client 集成依赖编码 工作流程其他学习canal资料 个人主页: 【⭐️个人主页】 需要您的【&#x1f496; 点赞关注】支持 &#x1f4af; M…

7.7、kali linux环境下搭建DVWA

目录 一、资料下载准备工作 1.1、DVWA源代码下载 二、开启Apache、mysql服务 2.1、下载Apache2文件 2.2、开启Apache2服务 方法一&#xff1a;开启Apache2服务&#xff08;手动&#xff09; 方法二&#xff1a;开启Apache2服务&#xff08;系统自启动&#xff09; 2.3、…

Linux进行模型微调前的环境准备

在Linux机器上对模型进行微调前&#xff0c;首先需要准备环境&#xff0c;即安装相关的软件。因为linux是一个无界面操作系统&#xff0c;软件安装完成后&#xff0c;还需要有便捷的交互方式编写脚本&#xff0c;调试脚本。此篇博客将专门介绍如何快速安装所需依赖软件&#xf…

黑马程序员SSM框架-Spring

视频链接&#xff1a;Spring-00-Spring课程介绍_哔哩哔哩_bilibili Spring Framework系统架构以及学习顺序 核心概念&#xff08;IoC、DI、Bean&#xff09; IoC入门案例 导入坐标 提供需要被管理的类&#xff08;Dao&#xff09;和需要被注入的类&#xff08;Service&#x…

Unity中Shader裁剪空间推导(在Shader中实现)

文章目录 前言一、在Shader中&#xff0c;手动把正交相机的坐标转化到裁剪空间1、我们在属性面板定义一个变量&#xff0c;用于传入摄像机的信息2、获取h、r、w、n、f3、获取OpenGL下的转化矩阵4、 获取DirectX下的转化矩阵5、手动将观察空间下的坐标转换到裁剪空间下6、这里为…

Java 对象内存布局

在虚拟机中&#xff0c;Java对象在内存中的布局可以分为三块&#xff1a; 对象头&#xff08;Header&#xff09; &#xff1a;包含 markword 标记字段和类型指针&#xff0c;32 位上大小是 8 个字节&#xff0c;64 位 16 个字节&#xff0c;实例数据&#xff08;Instance Dat…

sql_lab之sqli中的搜索型注入

搜索型注入 原理是运用模糊查询&#xff1a; select * from users where username like %a% 1.找到具有模糊查询的搜索框的注入点 2.构造闭合 因为模糊查询的代码是 select * from users where username like %a% 所以应该 鱼%’ -- s 判断构造闭合的函数是否正确 鱼%…

【DeepLearning】Deep Residual Learning for Image Recognition恺神大作学习

[TOC] Deep Residual Learning for Image Recognition 论文 1. 文章主要想解决什么问题&#xff0c;用了什么方法 深度神经网络在训练过程中的3个关键问题&#xff1a; 梯度消失/爆炸问题&#xff1a;随着网络层数的增加&#xff0c;梯度在反向传播过程中可能会变得非常小&a…

浅谈政企风险防控体系

政企风控体系是集团客户部在生产运营过程中对政企产品可能面临的风险进行监测&#xff0c;针对监测发现的风险&#xff0c;制定相应的管控措施&#xff0c;并跟进落实&#xff0c;以最大限度地减少或消除风险对组织的影响的管控体系。 本文之所以称为“浅谈”是因为文中主要围绕…

一条查询SQL是如何执行的?更新、新增、删除呢?

你好&#xff0c;我是田哥 本文共14629字&#xff0c;读完预计需要37分钟&#xff0c;建议先收藏。 大部分朋友估计都只知道写sql然后执行&#xff0c;但是并不知道MySQL背后到底是怎么实现的。 八股文中也有这么一道题&#xff1a;在MySQL中&#xff0c;一条SQL到底是如何执行…

【大数据存储与处理】开卷考试总复习笔记

文章目录 实验部分一、 HBase 的基本操作1. HBase Shell入门2. HBase创建数据库表3. HBase数据操作4. HBase删除数据库表5. HBase Python基本编程 before二、 HBase 过滤器操作1.创建表和插入数据2.行键过滤器3.列族与列过滤器4.值过滤器5.其他过滤器6.python hbase 过滤器编程…

通过 conda 安装 的 detectron2

从 detectron2官网 发现预编译的版本最高支持 pytorch1.10、cuda11.3。&#xff08;2023-12-26&#xff09; 1、安装 conda 环境。 conda create --name detectron2 python3.8 2、安装 pytorch1.10 和 cuda11.3。 pip3 install torch1.10.0cu113 torchvision0.11.1cu113 torc…

Hadoop之HDFS 详细教程

1、HDFS概述 Hadoop 分布式系统框架中&#xff0c;首要的基础功能就是文件系统&#xff0c;在 Hadoop 中使用FileSystem 这个抽象类来表示我们的文件系统&#xff0c;这个抽象类下面有很多子实现类&#xff0c;究竟使用哪一种&#xff0c;需要看我们具体的实现类&#xff0c;在…

CTFshow-pwn入门-栈溢出pwn41-pwn42

pwn41 我们首先将pwn文件下载下来&#xff0c;拖入到虚拟机查看一下文件的保护信息。 chmod x pwn checksec pwn该文件只开启了栈不可执行&#xff0c;并且文件是32位的。 我们把文件托到ida32中查看一下反编译代码。 int __cdecl main(int argc, const char **argv, const c…

大数据开发之Sqoop详细介绍

测试环境 CDH 6.3.1 Sqoop 1.4.7 一.Sqoop概述 Apache Sqoop&#xff08;SQL-to-Hadoop&#xff09;项目旨在协助RDBMS与Hadoop之间进行高效的大数据交流。用户可以在 Sqoop 的帮助下&#xff0c;轻松地把关系型数据库的数据导入到 Hadoop 与其相关的系统 (如HBase和Hive)中&…

呼叫中心知识库管理

呼叫中心向客户提供所需服务与支持的过程中&#xff0c;会遇到形形色色的客户和各式各样的问题&#xff0c;需要客服人员做出回答。客户对于客服人员的答复是否满意直接关系着呼叫中心的业绩&#xff0c;甚至企业的兴衰。而OKCC的知识库管理正是基于呼叫中心的这一需求而存在&a…

Python range函数新手指南:详细解析内部机制

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com range函数是Python中常用的内置函数之一&#xff0c;用于生成一系列连续的整数。本文将深入探讨range函数的内部实现&#xff0c;以揭示其工作原理和效率。 range函数的基本用法 range函数的基本用法。它通常使…

async和await的使用

async和await是promise的一种语法糖,也就是更简单易懂的写法。 在很多项目中,你会经常看到async和await的配合使用,看到原始的promise写法反而不多,就是因为async-await这种写法是用同步的语法去实现异步的逻辑。 基础使用 原生promise写法 let value nulllet proFn new P…

最新腾讯云2核2G轻量服务器性价比首选62元一年!

继昨天阿里云2核2G3M带宽轻量应用服务器降价到63元后&#xff0c;腾讯云迅速做出响应&#xff0c;腾讯云轻量2核2G3M服务器降价到62元一年&#xff0c;1元之差&#xff0c;你选择阿里云还是腾讯云&#xff1f;值得一提的是&#xff0c;阿里云不限制月流量&#xff0c;但是腾讯云…