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

个人主页:白日依山璟

专栏: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.mzph.cn/news/311358.shtml

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

相关文章

[蓝桥杯][2013年第四届真题]买不到的数目-模拟,数论

题目描述 小明开了一家糖果店。他别出心裁&#xff1a;把水果糖包成4颗一包和7颗一包的两种。糖果不能拆包卖。 小朋友来买糖的时候&#xff0c;他就用这两种包装来组合。当然有些糖果数目是无法组合出来的&#xff0c;比如要买 10 颗糖。 你可以用计算机测试一下&#xff0c;在…

.NET Core的HttpClient连接池管理

译者荐语&#xff1a;使用.NET Core的HttpClient连接池管理有哪些注意事项&#xff1f;本文给出了非常中肯的建议。原文来自互联网&#xff0c;由长沙DotNET技术社区编译。如译文侵犯您的署名权或版权&#xff0c;请联系小编&#xff0c;小编将在24小时内删除。本文来源[1]史蒂…

[蓝桥杯][2014年第五届真题]兰顿蚂蚁-模拟

题目描述 兰顿蚂蚁&#xff0c;是于1986年&#xff0c;由克里斯兰顿提出来的&#xff0c;属于细胞自动机的一种。 平面上的正方形格子被填上黑色或白色。在其中一格正方形内有一只“蚂蚁”。 蚂蚁的头部朝向为&#xff1a;上下左右其中一方。 蚂蚁的移动规则十分简单&#…

.NET Core开发实战(第17课:为选项数据添加验证:避免错误配置的应用接收用户流量)--学习笔记...

17 | 为选项数据添加验证&#xff1a;避免错误配置的应用接收用户流量三种验证方法1、直接注册验证函数2、实现 IValidateOptions3、使用 Microsoft.Extensions.Options.DataAnnotations延用上一节代码需要添加验证的时候不能用 Configure&#xff0c;而用 AddOptions 方法//se…

[蓝桥杯][2014年第五届真题]分糖果-模拟

题目描述 问题描述 有n个小朋友围坐成一圈。老师给每个小朋友随机发偶数个糖果&#xff0c;然后进行下面的游戏&#xff1a; 每个小朋友都把自己的糖果分一半给左手边的孩子。 一轮分糖后&#xff0c;拥有奇数颗糖的孩子由老师补给1个糖果&#xff0c;从而变成偶数。 反复进…

分支程序与循环程序设计-汇编实验二

DATA SEGMENT ;定义数据段BUF DB -1, 20, 3, 30, -5, 15, 100, -54, 0, 4, 78, 99DB -12, 32, 3, 23, -7, 24, 60,-51 ;定义比较大小的数据DATA ENDS ;数据段结束ESEG SEGMENT ;定义附加段RES1 DB 0;定义结果存放区RES2 DB 0RES3 DB 0 ESEG ENDS ;附加段结束CODE SEGMENT ;定义…

[蓝桥杯][2013年第四届真题]剪格子-dfs

题目描述 历届试题 剪格子 时间限制&#xff1a;1.0s 内存限制&#xff1a;256.0MB 问题描述 如下图所示&#xff0c;3 x 3 的格子中填写了一些整数。 我们沿着图中的星号线剪开&#xff0c;得到两个部分&#xff0c;每个部分的数字和都是60。 本题的要求就是请你编程判定&a…

使用有序GUID:提升其在各数据库中作为主键时的性能

原文出处&#xff1a;https://www.codeproject.com/articles/388157/guids-as-fast-primary-keys-under-multiple-database &#xff0c;避免今后忘记了再去阅读原英文。【】是感觉理解有问题的地方正确的使用有序GUID在大部分数据库中可以获得和 整型作为主键 时相媲美的性能。…

串操作指令及其应用程序的设计与调试运行——汇编实验四 用8086汇编完成下题 编制一程序,从键盘输入两个长度不同的字符串,设字符串长度小于25个字符。要求在屏幕上以右边对齐的形式显示出

文章目录实验目的和内容实验要求和步骤实现右对齐以下为源码&#xff1a;方法一方法二方法三测试一——字符串的输入输出测试二——改进测试三——改进测试四——改进实验目的和内容 实验要求和步骤 实现右对齐 以下为源码&#xff1a; 方法一 DATA SEGMENTNUM EQU 25BUF1 D…

python 语音播放_基于Python编写的语音播放软件

单位经常使用广播进行临时事项的通知(将文字转换为语音然后通过功放广播)&#xff0c;但是市面上多数语音播放软件都是收费的&#xff0c;要么发音失真&#xff0c;要么不够稳定——经常出现莫名其妙的故障&#xff0c;容易给工作带来被动。学Python这么久不如动手写一款自己的…

[蓝桥杯][历届试题]回文数字-暴力枚举

题目描述 观察数字&#xff1a;12321&#xff0c;123321 都有一个共同的特征&#xff0c;无论从左到右读还是从右向左读&#xff0c;都是相同的。这样的数字叫做&#xff1a;回文数字。 本题要求你找到一些5位或6位的十进制数字。满足如下要求&#xff1a; 该数字的各个数位之…

selenium.common.exceptions.WebDriverException: Message: ‘chromedriver‘ executable needs to bein PATH

使用Selenium模拟浏览器访问淘宝首页&#xff0c;出现报警 from selenium import webdriver import timebrowser webdriver.Chrome() browser.get(https://www.taobao.com) time.sleep(2) print(browser.page_source)selenium.common.exceptions.WebDriverException: Message…

【朝夕技术专刊】Core3.1WebApi_Filter详解

欢迎大家阅读《朝夕Net社区技术专刊》第4期我们致力于.NetCore的推广和落地&#xff0c;为更好的帮助大家学习&#xff0c;方便分享干货&#xff0c;特创此刊&#xff01;很高兴你能成为忠实读者&#xff0c;文末福利不要错过哦&#xff01;01PARTCoreWebApi五大Filter1. Autho…

统计学习方法 pdf_机器学习基础教材-《统计学习与数据分析介绍》免费pdf分享...

本书介绍本入门级统计教科书主要讲解发展和培养统计思维所需的基本概念和工具。它提供了描述性&#xff0c;归纳性和探索性的统计方法&#xff0c;并指导读者完成定量数据分析的过程。在实验科学和跨学科研究中&#xff0c;数据分析已成为任何科学研究的组成部分。诸如判断数据…

[蓝桥杯][2013年第四届真题]危险系数-dfs+图的遍历

题目描述 问题描述 抗日战争时期&#xff0c;冀中平原的地道战曾发挥重要作用。 地道的多个站点间有通道连接&#xff0c;形成了庞大的网络。但也有隐患&#xff0c;当敌人发现了某个站点后&#xff0c;其它站点间可能因此会失去联系。 我们来定义一个危险系数DF(x,y)&#xff…

selenium.common.exceptions.SessionNotCreatedException: Message: session not created全套解决方案

chromedriver版本不匹配 报错&#xff1a; selenium.common.exceptions.SessionNotCreatedException: Message: session not created selenium.common.exceptions.WebDriverException: Message: session not created: 原因&#xff1a; Chrome版本和ChromeDriver版本不一致…

.NET Core开发实战(第18课:日志框架:聊聊记日志的最佳姿势)--学习笔记(上)...

18 | 日志框架&#xff1a;聊聊记日志的最佳姿势源码链接&#xff1a;https://github.com/witskeeper/geektime/tree/master/samples/LoggingSimpleDemo日志框架必要的包&#xff1a;1、Microsoft.Extensions.Logging2、Microsoft.Extensions.Logging.Console3、Microsoft.Exte…

python递归实现_Python-递归实现

#递归实现def calc(n):print(n)if n/2 >1:res calc(n/2)print(res:,res)print(N:,n)return ncalc(100)#斐波那契数列def func(arg1,arg2,stop)if arg1 0:print(arg1,arg2)arg3 arg1 arg2print(arg3)if arg3 < stop:func(arg2,arg3,stop)func(0,1,30)#算法基础之二分查…

[蓝桥杯][2013年第四届真题]核桃的数量-枚举(水题)

题目描述 小张是软件项目经理&#xff0c;他带领3个开发组。工期紧&#xff0c;今天都在加班呢。为鼓舞士气&#xff0c;小张打算给每个组发一袋核桃&#xff08;据传言能补脑&#xff09;。他的要求是&#xff1a; 各组的核桃数量必须相同各组内必须能平分核桃&#xff08;当…

python2字符串编码方式_一、基础部分-2.字符串编码

一、字符编码历史1. ASCII美国人搞了个ASCII码表&#xff0c;把123abcABC%$#(数字、字母、特殊符号) &#xff0c;全部用10进制的数字表示。例如数字65&#xff0c;代表着“A” &#xff0c;ASCII码表一共255个数字&#xff0c;基本代表米国常用英文和符号(其实127以后都不是太…