LeetCode第160题——相交链表(Java)

news/2025/3/28 16:10:38/

题目描述

给你两个单链表的头节点 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 = 2, listA = [1,9,1,2,4], listB = [3,2,4], skipA = 3, skipB = 1
输出:Intersected at '2'
解释:相交节点的值为 2 (注意,如果两个链表相交则不能为 0)。
从各自的表头开始算起,链表 A 为 [1,9,1,2,4],链表 B 为 [3,2,4]。
在 A 中,相交节点前有 3 个节点;在 B 中,相交节点前有 1 个节点。

示例 3:

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]

思路

  1. 首先,最容易想到的方法是,分别遍历两个链表,使用hashMap来存储记录标识节点出现次数,出现次数超过一次的节点即为第一个相加节点。这样方法当然可以,不过时间复杂度肯定不小,这不是我们想要的。

  2. 思路二,通过观察题干可以发现,两条链表是在相交节点相遇,之后的节点全部相同,所以我们可以使用双指针node1与node2,分别遍历A链表与B链表,node1遍历完A链表后遍历B链表,node2遍历完B链表后遍历A链表。这样两个指针遍历的节点总数目是相同的,如果A链表与B链表是有相交节点的话,那么一定会出现node1与node2指针相同的情况(node与node2不为null),如果A链表与B链表没有相交,那么最终node1与node2指针都会指向null

  3. 可以理解成两个人速度一致, 走过的路程一致。那么肯定会同一个时间点到达终点。如果到达终点的最后一段路两人都走的话,那么这段路上俩人肯定是肩并肩手牵手的

  • node1走过的路径为A链+B链

  • node2走过的路径为B链+A链

  • pA和pB走过的长度都相同,都是A链和B链的长度之和,相当于将两条链从尾端对齐,如果相交,则会提前在相交点相遇,如果没有相交点,则会在最后相遇。

pA:1->2->3->4->5->6->null->9->5->6->null
pB:9->5->6->null->1->2->3->4->5->6->null

代码

/*** 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) {if(headA==null||headB==null) return null;ListNode node1=headA,node2=headB;while(node1!=node2){node1 = (node1==null)? headB:node1.next;node2 = (node2==null)? headA:node2.next;}return node1;}
}

在这里插入图片描述


http://www.ppmy.cn/news/55771.html

相关文章

Python 3 实现给定的DNA 序列转换为其蛋白质等价物

相关Python源码和数据集下载:https://download.csdn.net/download/tianqiquan/87738198 DNA ⇒ RNA ⇒ 蛋白质 生命取决于细胞存储、检索和翻译遗传指令的能力。这些指令是制造和维持活生物体所必需的。很长一段时间,都不清楚哪些分子能够复制和传递遗传信息。我们现在知道…

【Auto-GPT云部署】

部署自己的Auto-Gpt 先说说什么是Chat-Gpt Chat-GPT (Generative Pretrained Transformer)是由OpenAI提出的一种自然语言处理技术&#xff0c;是基于Transformers和预训练机制的大规模语言模型。与传统的基于规则或基于统计的自然语言处理方法不同&#xff0c;Chat-GPT使用深…

Linux下的常用命令

ls 列出目前工作目录所含之文件及子目录mkdir -p 创建多级文件夹&#xff0c;例如&#xff1a; test01/test02/test03 mkdir -p test01/test02/test03top 查看运行的所有进程 top之后按c 可以查看具体的位置&#xff0c; 按1&#xff0c;可以查看cupps aux --sort rss 按照正序…

Java入门教程||Java 封装||Java 接口

Java 封装 在面向对象程式设计方法中&#xff0c;封装&#xff08;英语&#xff1a;Encapsulation&#xff09;是指&#xff0c;一种将抽象性函式接口的实作细节部份包装、隐藏起来的方法。 封装可以被认为是一个保护屏障&#xff0c;防止该类的代码和数据被外部类定义的代码…

2023有潜力的新药都有哪些?新药筛选方法总结

2023有潜力的新药都有哪些&#xff1f;这是一道蕴含无限可能性和未知挑战的问题。新药研发是制药公司不断追求的目标&#xff0c;每一次成功都可以带来巨额利润&#xff0c;改善患者生命质量&#xff0c;成就公司声誉。但与此同时&#xff0c;新药研发风险也是极大的&#xff0…

ESP8266使用SDK软硬件定时执行函数

1、软件定时 以下接口使用的定时器由软件实现&#xff0c;定时器的函数在任务中被执行。因为任务可能被中断&#xff0c;或者被其他高优先级的任务延迟&#xff0c;因此以下os_timer系列的接口并不能保证定时器精确执行。 注意&#xff1a; ①对于同一个 timer&#xff0c;os…

SpaceX的星舰爆炸了:产品开发,快速失败真的很重要

目录 前言 快速失败 产品生命周期 专栏上线 前言 看到很多人都在聊星舰&#xff0c;今天就来简单谈谈“炸星舰”带给我们的启示。 在美国中部时间20日&#xff0c;SpaceX公司的“星舰”超重型火箭进行了首次轨道飞行。 但在该火箭成功点火升空几分钟后&#xff0c;却在半…

ABAP 二分法查找与SORT排序

需求场景 需要对内表排序&#xff0c;按降序排列&#xff0c;获取第一行&#xff1b;二分法查找需要的数据 我按照降序排列后&#xff0c;获取到了第一行&#xff0c;但是通过二分法查找没有获取到 二分法查找 二分查找&#xff0c;对排序数组通过二分区间排除的方法进行快速…