HOT22-相交链表

news2024/11/16 18:35:22

leetcode原题链接:相交链表

题目描述

      给你两个单链表的头节点 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
输出: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
  • 如果 listA 和 listB 没有交点,intersectVal 为 0
  • 如果 listA 和 listB 有交点,intersectVal == listA[skipA] == listB[skipB]

解题方法:先计算两个链表的长度差diff_len,用两个指针扫描两个链表,更长的链表指针先走diff_len步,然后同时走,若两指针相遇,则相遇节点为第一个相交的节点。

C++代码

#include <iostream>
/*
struct ListNode {
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};
*/
class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        if (!headA || !headB) {
            return nullptr;
        }
        ListNode *pa = headA;
        ListNode *pb = headB;
        int len_a = 0; //记录headA的链表长度
        int len_b = 0; //记录headB的链表长度
        // 计算headA的长度
        while (pa) {
            len_a++;
            pa = pa->next;
        }
        // 计算headB的长度
        while (pb) {
            len_b++;
            pb = pb->next;
        }
        // 计算两个长度的差值diff_len,使长的链表先走diff_len的长度
        int diff_len = 0;
        pa = headA; //恢复指针pa位置
        pb = headB; //恢复指针pb位置
        if (len_a < len_b) {
            diff_len = len_b - len_a;
            for (int i = 0; i < diff_len; i++) {
                pb = pb->next;
            }
        } else if (len_a > len_b ) {
            diff_len = len_a - len_b;
            for (int i = 0; i < diff_len; i++) {
                pa = pa->next;
            }
        }
        // 两个指针同时继续前进
        while (pa && pb) {
            if (pa == pb) {
                return pa;
            }
            pa = pa->next;
            pb = pb->next;
        }
        return nullptr;
    }
};

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

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

相关文章

可视化低代码编程平台项目

后端Spring BootMySQL 前端Vue 同学通过这个项目练手&#xff0c;简历上写出来也蛮有亮点的。 技术栈比较全面&#xff0c; 项目可以提高公司的开发效率&#xff0c;特别是方便产品经理或者业务线人员直接可视化生成UI

java之路——带你了解springboot框架与其基本使用

文章目录 一、springboot的发展背景二、什么是springboot三、springboot的地位四、开发步骤 一、springboot的发展背景 要了解springboot&#xff0c;我们先要了解Spring Boot的发展背景。 Spring Boot的发展背景可以追溯到Spring Framework的诞生和演进过程。 首先&#xff…

Linux常用命令——free命令

在线Linux命令查询工具 free 显示内存的使用情况 补充说明 free命令可以显示当前系统未使用的和已使用的内存数目&#xff0c;还可以显示被内核使用的内存缓冲区。 语法 free(选项)选项 -b # 以Byte为单位显示内存使用情况&#xff1b; -k # 以KB为单位显示内存使用情况…

【Docker】Exited 139解决Window下docker启动oracle11g失败Exited 139

前几天&#xff0c;在docker安装了oracle11&#xff0c;安装非常简单&#xff0c;但是启动的时候启动不起来&#xff0c;且没有任何log日志输出&#xff01; docker 拉取安装oracle11 docker pull registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g安装完成后启动oracle …

Nature Biomedical Engineering --利用白细胞“吃掉”实体瘤

癌症仍然是美国死亡率最高的疾病之一&#xff0c;每年导致的死亡人数超过60万人。形成实体肿瘤的癌症&#xff0c;如乳房、大脑或皮肤肿瘤&#xff0c;尤其难以治疗。外科手术通常是对抗实体肿瘤的第一道防线。但是&#xff0c;手术可能无法完全清除癌细胞&#xff0c;残留的细…

Linux运维监控学习笔记6

触发器&#xff08;重点&#xff09; 触发器&#xff08;trigger&#xff09;&#xff1a;定义监控项到达一个临界值&#xff08;阈值&#xff09;或者满足一个条件&#xff0c;就会发现状态变化&#xff08;OK变为Problem&#xff0c;Problem变为OK&#xff09;。 监控agent1…

FFmpeg工具使用(一)

转码 指令 ffmpeg -i input.mp4 output.avi 这个指令是使用FFmpeg工具对视频进行格式转换的命令。 其中&#xff0c;"-i input.mp4"表示指定输入文件为"input.mp4"&#xff0c;而"output.avi"则是指定输出文件名&#xff0c;并将视频转码成A…

【无标题】TI AM64x工业核心板规格书(双核ARM Cortex-A53 + 单/四核Cortex-R5F + 单核Cortex-M4F,主频1GHz)

1 核心板简介 创龙科技SOM-TL64x是一款基于TI Sitara系列AM64x双核ARM Cortex-A53 单/四核Cortex-R5F 单核Cortex-M4F设计的多核工业级核心板&#xff0c;通过工业级B2B连接器引出5x TSN Ethernet、9x UART、2x CAN-FD、GPMC、PCIe/USB 3.1等接口。核心板经过专业的PCB Layo…

ModaHub AI模型开源社区——向量数据库Milvus存储操作教程

目录 存储操作 数据插入 数据落盘 定时触发 客户端触发 缓冲区达到上限触发 数据合并 建立索引 删除 删除集合 删除分区 删除实体 数据段整理 数据读取 常见问题 存储操作 阅读本文前&#xff0c;请先阅读 存储相关概念。 数据插入 客户端通过调用 insert 接…

读写锁原理解读

目录 回顾什么是读写锁 t1 w.lock&#xff0c;t2 r.lock t3 r.lock&#xff0c;t4 w.lock t1 w.unlock t2 r.unlock&#xff0c;t3 r.unlock 写锁上锁流程 写锁释放流程 读锁上锁流程 读锁释放流程 回顾什么是读写锁 读写锁是一对互斥锁&#xff0c;分为读锁和写锁。…

UG\NX二次开发 显示临时标记 UF_DISP_display_temporary_point

文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan 简介: 显示临时标记 UF_DISP_display_temporary_point,最后一个参数控制显示的类型,可通过下表1表2查询 表1: 表2: 0UF_DISP_NO_MARKER

jenkins构建异常Type org.springframework.boot.maven.RepackageMojo not present

目录 问题描述解决过程 问题描述 我公司dev环境使用的是spug构建&#xff0c;当时构建并没有出现这种问题&#xff0c;而线上使用的是jenkins部署到华为云上&#xff0c;构建线上的时候却出现了这个问题。 java.lang.TypeNotPresentException: Type org.springframework.boot…

leetcode72. 编辑距离(动态规划-java)

编辑距离 leetcode72. 编辑距离题目描述解题思路代码演示 动态规划代码演示 动态规划专题 leetcode72. 编辑距离 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problems/edit-distance 题目描述 给你两个单词 word1 和 word2&am…

关于DMS批量导入的注意事项

前言 当你注意了列命和数据库对应关系&#xff0c;批量后报错&#xff0c;常见的是无列名都好找问题&#xff0c;说一条不好找的 SQL解析失败:解析文件失败::读取字段定义异常&#xff0c;字段定义存在非法的空字段&#xff0c;请检查提交的Excel文件首行中的字段定义1、列名…

springboot本机启动elasticjob抛出异常HostException(ip is null)

1.使用的elasticjob版本为3.0.1 2.本机的IPV4在校验isReachable 返回false&#xff08;可能是使用无线网&#xff0c;导致ip验证问题&#xff09; 3.最后引入Groovy解决 引入包 <dependency><groupId>org.codehaus.groovy</groupId><artifactId>gr…

【CSS3系列】第九章 · 响应式布局和BFC

写在前面 Hello大家好&#xff0c; 我是【麟-小白】&#xff0c;一位软件工程专业的学生&#xff0c;喜好计算机知识。希望大家能够一起学习进步呀&#xff01;本人是一名在读大学生&#xff0c;专业水平有限&#xff0c;如发现错误或不足之处&#xff0c;请多多指正&#xff0…

OpenCV快速生成带边缘的棋盘格

import numpy as np import cv2 as cv# 生成棋盘格 def generateChessBoard(xSize32,ySize32,w6,h6)::param xSize: 棋盘尺寸:param ySize: 棋盘尺寸:param w: 横向角点个数:param h: 纵向角点个数:return:w,hw1,h1boardnp.zeros((xSize*(w),ySize*(h),3),np.uint8)board.fill(…

【网页复习】4道大题

&#x1f38a;专栏【 前端易错合集】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【如愿】 大一同学小吉&#xff0c;欢迎并且感谢大家指出我的问题&#x1f970; 文章目录 &#x1f354;实现如图的导航栏⭐代码&#x1f384;注…

多元分类预测 | Matlab萤火虫算法(FA)优化极限学习机(ELM)的分类预测,多特征输入模型。FA-ELM分类预测模型

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元分类预测 | Matlab萤火虫算法(FA)优化极限学习机(ELM)的分类预测,多特征输入模型。FA-ELM分类预测模型 多特征输入单输出的二分类及多分类模型。程序内注释详细,直接替换数据就可以用。程序语言为matlab,程…

6 中断概览

目录 中断概览 STM32异常和中断介绍 STM32的异常一览 STM32的中断表一览 中断的优先级 中断的优先级分组 优先级分组 嵌套向量中断控制器(NVIC)功能 中断概览 什么是中断&#xff1f; 中断是指计算机运行过程中&#xff0c;出现某些意外情况需主机干预时&#xff0c;机器…