当前位置: 首页 > news >正文

leetcode_面试题 02.07. 链表相交_java

面试题 02.07. 链表相交https://leetcode.cn/problems/intersection-of-two-linked-lists-lcci/

1、题目

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

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

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

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

示例 1:

输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3
输出:Intersected at '8'
解释:相交节点的值为 8 (注意,如果两个链表相交则不能为 0)。
从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,0,1,8,4,5]。
在 A 中,相交节点前有 2 个节点;在 B 中,相交节点前有 3 个节点。

示例 2:

输入:intersectVal = 2, listA = [0,9,1,2,4], listB = [3,2,4], skipA = 3, skipB = 1
输出:Intersected at '2'
解释:相交节点的值为 2 (注意,如果两个链表相交则不能为 0)。
从各自的表头开始算起,链表 A 为 [0,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
输出:null
解释:从各自的表头开始算起,链表 A 为 [2,6,4],链表 B 为 [1,5]。
由于这两个链表不相交,所以 intersectVal 必须为 0,而 skipA 和 skipB 可以是任意值。
这两个链表不相交,因此返回 null 。

提示:

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

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

2、题解

/**
 * 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) {
        // 创建两个虚拟头节点,分别指向链表 A 和 B 的头节点
        ListNode dummyHeadA = new ListNode(0);
        dummyHeadA.next = headA;
        ListNode dummyHeadB = new ListNode(0);
        dummyHeadB.next = headB;

        // 定义两个指针分别遍历链表 A 和 B
        ListNode curA = dummyHeadA;
        ListNode curB = dummyHeadB;

        // 计算链表 A 和链表 B 的长度
        int sizeA = 0;
        int sizeB = 0;

        // 遍历链表 A,计算其长度
        while(curA != null) {
            sizeA ++;
            curA = curA.next;
        }

        // 遍历链表 B,计算其长度
        while(curB != null) {
            sizeB ++;
            curB = curB.next;
        }

        // 调整 curA 和 curB 的起始位置,确保它们同时开始遍历公共部分
        int num = 0;
        curA = dummyHeadA;
        curB = dummyHeadB;

        // 如果链表 A 比链表 B 长,先移动链表 A 的指针,直到它们的剩余部分长度相等
        if(sizeA >= sizeB) {
            num = sizeA - sizeB;
            while(num > 0 && curA != null) {
                curA = curA.next;  // curA 向前移动
                num--; // 减少差值
            }
        } else {  // 如果链表 B 比链表 A 长,先移动链表 B 的指针,直到它们的剩余部分长度相等
            num = sizeB - sizeA;
            while(num > 0 && curB != null) {
                curB = curB.next;  // curB 向前移动
                num--; // 减少差值
            }
        }

        // 同时移动 curA 和 curB,直到它们指向同一个节点或者都到达链表末尾
        while(curA != null && curB != null) {
            if(curA == curB) {  // 找到交点
                break;  // 如果两个指针相等,说明找到了交点
            }
            curA = curA.next;  // curA 向前移动
            curB = curB.next;  // curB 向前移动
        }

        // 返回交点,如果没有交点,返回 null
        return curA;  // 如果有交点,则返回交点节点;如果没有交点,则返回 null
    }
}

http://www.dtcms.com/a/122452.html

相关文章:

  • Interactron: Embodied Adaptive Object Detection(训练时进行更新参数) 还没看懂
  • 金融数据分析(Python)个人学习笔记(7):网络数据采集以及FNN分类
  • React八案例上
  • Seq2Seq - 编码器(Encoder)和解码器(Decoder)
  • Linux系统安全及应用
  • Spring AI Alibaba MCP 市场正式上线!
  • spark安装过程问题
  • CSS 定位属性的生动比喻:以排队为例理解 relative 与 absolute
  • HP EVA SAN 的基础知识及常见数据丢失问题
  • 【nnUNetv2进阶】二十九、nnUNetv2 魔改网络-小试牛刀-引入RCM(Rectangular Self-Calibration Module)
  • Mybatis操作数据库
  • 8. git branch
  • spring mvc 异常处理中@RestControllerAdvice 和 @ControllerAdvice 对比详解
  • Linux服务器——Samba服务器
  • 【C++编程基础-关键字】:constexpr和const
  • Vue3服务端渲染实战:Nuxt3深度解析与高性能SSR架构设计
  • vLLM实战:多机多卡大模型分布式推理部署全流程指南
  • 深入探究Python的re模块及其在爬虫中的应用
  • 界面控件DevExpress WPF v25.1新功能预览 - 数据网格、报表性能增强
  • [特殊字符] Hyperlane:Rust 高性能 HTTP 服务器库,开启 Web 服务新纪元!
  • ARM裸机全集学习笔记【链接来源:向阳而生,逆风翻盘】
  • 智能家居设备
  • Ansible(5)——编写 Playbook
  • SpringMVC的请求-文件上传
  • 如何利用 Java 爬虫获取京东商品详情信息
  • scala总结与spark安装
  • 游戏引擎学习第213天
  • 【scikit-learn基础】--『预处理』之 正则化
  • JetBrains Terminal 又发布新架构,Android Studio 将再次迎来新终端
  • 21 天 Python 计划:MySQL中DML与权限管理