力扣160 相交链表 java达成

news/2025/11/28 22:00:27/文章来源:https://www.cnblogs.com/ljbguanli/p/19284255

力扣160 相交链表 java达成

160. 相交链表

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

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

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

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

自定义评测:

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

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

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

示例 1:

输入: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:

输入: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:

输入:intersectVal = 0, listA = [2,6,4], listB = [1,5], skipA = 3, skipB = 2
输出:No intersection
解释:从各自的表头开始算起,链表 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
  • 如果 listA 和 listB 没有交点,intersectVal 为 0
  • 如果 listA 和 listB 有交点,intersectVal == listA[skipA] == listB[skipB]

进阶:你能否设计一个时间复杂度 O(m + n) 、仅用 O(1) 内存的解决方案?

一、可以选择正常思路,先统计出两个链表的长度,然后再对齐两个链表,最后同时遍历进行寻找,这种办法较普通,代码繁琐

二、 也可以选择使用建两个节点指针 A​ , B 分别指向两链表头节点 headA , headB ,做如下操作: 指针 A 先遍历完链表 headA ,再开始遍历链表 headB ,当走到 node 时,共走步数为:
    a+(b−c)  指针 B 先遍历完链表 headB ,再开始遍历链表 headA ,当走到 node 时,共走步数为:  b+(a−c) 如下式所示,此时指针 A , B 重合,并有两种情况:   a+(b−c)=b+(a−c) 若两链表 有 公共尾部 (即 c>0 ) :指针 A , B 同时指向「第一个公共节点」node 。若两链表 无 公共尾部 (即 c=0 ) :指针 A , B 同时指向 null 。

第一种方法代码如下:

    public static void main(String[] args) {   // 测试用ListNode node1 = new ListNode(1);node1.next = new ListNode(9);node1.next.next = new ListNode(1);node1.next.next.next = new ListNode(2);node1.next.next.next.next = new ListNode(4);ListNode node2 = new ListNode(3);node2.next = node1.next.next.next;System.out.println(getIntersectionNode(node1, node2));}public static ListNode getIntersectionNode(ListNode headA, ListNode headB){ListNode res = null;ListNode temp1 = headA;ListNode temp2 = headB;int n1 = 1;int n2 = 1;while (temp1.next != null){    // 遍历两个链表得到链表长度temp1 = temp1.next;n1++;}while (temp2.next != null){temp2 = temp2.next;n2++;}if (temp1 != temp2){            // 若此时末尾节点是同一个则说明两个链表有相交,反之则没有相交直接返回nullreturn res;}else {int target = Math.abs(n2 - n1);      // 计算出两个链表的相差节点个数,由于两个链表相交后的节点一定相同,所以后面节点个数一定相同,只需要对齐两个链表即可if (n1 > n2){                        // 如果链表A较长,则使A先对齐,反之使B对齐for (int i = 0; i < target; i++) {headA = headA.next;}}else {for (int i = 0; i < target; i++) {headB = headB.next;}}while (headA != headB){                 // 对齐后遍历后续链表headA = headA.next;headB = headB.next;}res = headA;}return res;}

第二种方法代码如下:

    public static void main(String[] args) {    // 测试 用ListNode node1 = new ListNode(1);node1.next = new ListNode(9);node1.next.next = new ListNode(1);node1.next.next.next = new ListNode(2);node1.next.next.next.next = new ListNode(4);ListNode node2 = new ListNode(3);node2.next = node1.next.next.next;System.out.println(getIntersectionNode(node1, node2));}public static ListNode getIntersectionNode(ListNode headA, ListNode headB){ListNode a = headA,b = headB;while (a!=b) {a=a==null?headB:a.next;b=b==null?headA:b.next;}return a;}

以上为记录分享用,代码较差请见谅

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

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

相关文章

`train_test_split` 是什么?

一、函数基础:train_test_split 是什么? train_test_split 是 sklearn 提供的数据集划分工具,核心功能是:随机打乱原始数据(避免数据有序性导致的偏差); 按指定比例拆分数据为「两部分」(默认是训练集和测试集…

解决LVGL与FATFS编码格式冲突及外挂字库方案

问题描述 在使用LVGL和FATFS文件系统时,遇到了编码格式不一致的问题:LVGL 默认使用 UTF-8 编码 CubeMX生成的FATFS 使用 GBK 编码 从SD卡读取的字符文字为GBK格式,导致在LVGL中显示时出现乱码参考解决方案:http://…

我是如何用浏览器插件轻松抓取抖音评论并实现精准搜索分析的

vx:llike620 gofly.v1kf.com 之前我成功用浏览器插件获取了抖音粉丝数据,这个经验让我意识到,同样的技术原理完全可以应用到抖音评论抓取上。现在,我已经实现了这个想法,让我来分享这个实用的数据获取方法。 我是…

重练算法(代码随想录版) day24 - 回溯part3

今日刷题量:3 当前刷题总量:104 Easy: 53 Mid: 49 Hard: 2 Day24 常用思想 1.一定要学会剪枝,判断怎么去剪枝可以优化递归分支 2.组合问题和分割问题都是收集树的叶子节点,而子集问题是找树的所有节点 3.去重问题一…

详解np.random.normal(0, 3, size=x.shape)

一、完整语法与参数解释 np.random.normal(loc=0, scale=1, size=None) 是 NumPy 中生成「正态分布(高斯分布)」随机数的核心函数,参数含义如下:参数名 默认值 作用说明 对应代码中的含义loc 0 正态分布的「均值(…

代码随想录Day23_回溯_组合.md

代码随想录Day23_回溯_组合.md回溯练习:再有重复元素和无重复元素的数组中分别找到和为target的子集,以及给出指定字符串的回文子字符串。在数组中找出和为固定值的组合在有重复数字的数组中找出和为固定值的组合 给…

详细介绍:【JUnit实战3_21】第十二章:JUnit 5 与主流 IDE 的集成 + 第十三章:用 JUnit 5 做持续集成(上):在本地安装 Jenkins

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

代码随想录Day24_回溯_复原IP.md

代码随想录Day24_回溯_复原IP.md复原IP地址 题目理解 1.给出的是字符串,IP地址在【0,255】之间,字符串转数字; 2.0可以单独出现,但是不能跟数字出现; 3.字符串中要插入.; 4.字符串的大小范围在4~12之间; 5.不能…

何以为生

何以为生何以为生人造的东西 价值不贵。 天然的才是资源。不能打断别人说话, 不急不躁。很想买入一支股票。。。

GraphRAG进阶:基于Neo4j与LlamaIndex的DRIFT搜索实现详解

微软的GraphRAG算得上是最早一批成熟的GraphRAG系统,它把索引阶段(抽取实体、关系、构建层级社区并生成摘要)和查询阶段的高级能力整合到了一起。这套方案的优势在于,可以借助预先计算好的实体、关系、社区摘要来回…

Gemini3疯了!0.09接入Nano Banana Pro 4k画质API(附实战教程)

2025年11月20日谷歌正式推出Nano Banana Pro(官方名称Gemini 3 Pro Image)时,Ai图像生成最强模型。这款基于Gemini 3 Pro foundation打造的新一代图像生成与编辑模型,不仅在图像质量上达到了全新高度,更在4K高清分…

11/28

今天没课,嘿嘿

noip板子

倍增法lca const int N = 500010; int n, m, s; vector<int> g[N]; void addeg(int u, int v) {g[u].push_back(v);g[v].push_back(u); }int d[N], anc[N][25]; void dfs(int u, int fa) {d[u] = d[fa] + 1;for …

东方博宜OJ 1119:求各位数字之和 ← 循环结构

​【题目来源】https://oj.czos.cn/p/1119【题目描述】输入一个正整数 N(0≤N≤2147483647),求它的各位数字之和。【输入格式】一行,一个正整数 N。【输出格式】一行,一个整数。【输入样例】189【输出样例】18【数…

2025.11.28

起床,吃饭,躺着,上网课,洗澡,买酸奶,吃饭,睡觉

10个免费查重降重工具分享,降AIGC率工具

在当前的学术环境中,确保论文的原创性和降低AI生成内容(AIGC)的检测率变得尤为重要。以下是一些能够有效降低论文AIGC率的工具,包括它们的功能、使用方法、效果以及用户评价。 SpeedAI 功能:SpeedAI专注于去除文档…

Linux_Socket_浅谈UDP - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Jetlinks 物联网平台 开源版学习源码分析

2022-06-25 Jetlinks Jetlinks 是一个非常优秀物联网基础平台, 还支持开源二次开发, 且他们的开发团队还非常友好的, 即使你使用的是开源的版本还挺愿意帮你解决问题 (当然我司也购买了企业版, 但不能分享学习笔记) 文…