LeetCode刷题---160. 相交链表(双指针-对撞指针)

news2024/11/15 20:00:06

文章目录

  • 一、编程题:160. 相交链表(双指针-对撞指针)
      • 1.题目描述
      • 2.示例1:
      • 3.示例2:
      • 4.示例3:
      • 5.提示:
      • 6.提示:
  • 二、解题思路
      • 1.思路
      • 2.复杂度分析:
      • 3.算法图解
  • 三、代码实现
  • 总结


一、编程题:160. 相交链表(双指针-对撞指针)

1.题目描述

  给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。图示两个链表在节点 c1 开始相交:
在这里插入图片描述
题目数据 保证 整个链式结构中不存在环。
注意,函数返回结果后,链表必须 保持其原始结构 。
自定义评测:
评测系统 的输入如下(你设计的程序 不适用 此输入):

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

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

2.示例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 中第四个节点) 在内存中指向相同的位置。

3.示例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 个节点。

4.示例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 。

5.提示:

  • 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]

6.提示:

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

二、解题思路

  【前言】很开心,练习不少双指针思想,这题是自己想出来,但思路还是有待优化,还是言归正传吧。
  这题可采用双指针,本题主要有两个关键点:

  • 1.该怎么去移动这两个指针?这一点要理清楚。这里双指针移动就比较简单了,分别向下移动一步即可;
  • 2.这里才是本题的难点了,怎么让其两个指针进行相撞,这里就涉及到一些公式推导了。

1.思路

解决方法1(个人想法):

有链表遍历完时:

  • Step 1.创建指针moveA和moveB分别指向headA和headB,依次往后遍历;
  • Step 2.当moveA到了末尾,则moveA=headB继续遍历;
  • Step 3.当moveB到了末尾,则moveB=headA继续遍历;
  • Step 4.当moveA==moveB说明有相交结点,返回该结点。反之遍历结束没有出现相交结点,返回null;

  这里2、3步主要是消除链表之间的长度差。
  当链表出现相交时,则会有相同结点数m,这里可以设A链表起点到相交点的结点个数为a,B链表起点到相交点的结点个数为b;
  由上可知A链表长度为a+m,B链表长度为b+m,这里不妨大胆设想一下,当a==b时,就有a+m=b+m,那么moveA和moveB移动a步就能相遇了。根据这个设想可以设a+x=b(1),其中x为未知数。
  当链表长度都相等时,只需要移动相同步数就可以相遇,令a+x+m=b+m(2),结合公式(1)(2)可得 x=b-a,这里x代表链表之间的长度差。所以问题就变成怎么消除链表之间的长度差。 只需要将较长的链表多走x步,两个指针会同时到达两个链表相交的节点,该节点也是两个指针第一次同时指向的节点,此时返回相交的节点。

看不懂解释的话,直接看算法图解比较容易理解点

2.复杂度分析:

时间复杂度:O(m+n),其中m和n是分别是链表headA和headB 的长度。两个指针同时遍历两个链表,每个指针遍历两个链表各一次。
空间复杂度: O(1)

3.算法图解

红色部分代表双指针相撞(注:本人不会做成流程动画,希望会的朋友可以私信我指点一二,说个软件名字也可以,谢谢

请添加图片描述


三、代码实现

每个代码块都写了注释,方便理解,代码还可以改进;
(根据个人想法编写)

public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        ListNode moveA = headA, moveB = headB;
        while(moveA.next != null || moveB.next != null){
            if(moveA == moveB) return moveB;
            moveB = moveB.next == null ? headA : moveB.next;
            moveA = moveA.next == null ? headB : moveA.next;
        }
        if(moveA == moveB) return moveB;
        return null;
    }
}

提交结果:

image.png


总结

以上就是今天要讲的内容,做题的时候就隐约的感觉到用数学公式来推导可能会快点,根据假设长度等长的情况,推导出了先跑完在换另外一个头结点接着跑,如果有交点,那这两指针必然会相遇。所以就赶紧记录一下这个想法。

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

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

相关文章

CSS——图标字体

为什么需要图标字体&#xff1f; 在网页中经常会有需要使用一些图标的地方&#xff0c;比如&#x1f6d2; &#xff0c; &#x1f464;&#xff0c;⏫等等&#xff0c;虽然我们可以通过图片来引入图标&#xff0c;但是图片本身比较大&#xff0c;页面刷新加载图片耗时不说&…

[附源码]java毕业设计小区疫情防控系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

知乎乱码、b站首页乱码、蓝奏云网盘打不开都是DNS惹的祸!修改设备的DNS

知乎乱码、b站首页乱码、蓝奏云网盘打不开等问题&#xff0c;常常是连接WiFi的时候会出现&#xff0c;一旦将手机切换为蜂窝、或者给电脑用蜂窝热点这个问题就能解决&#xff1a; 接下来教一下大家如何修改自己设备的DNS,从而 修复知乎乱码、b站首页乱码、蓝奏云网盘打不开 0.…

八环氧环己基乙基笼状聚倍半硅氧|八苯胺丙基poss

八环氧环己基乙基笼状聚倍半硅氧 外观&#xff1a;透明&#xff0c;淡黄色半固体状物 黏度&#xff1a;50000cps&#xff08;60℃&#xff09; 密度&#xff1a;1.25g/ml 分子量&#xff1a;1418 环氧当量&#xff1a;177 折射率&#xff1a;1.52 溶解性&#xff1a;溶于…

所见即所得的3D打印建模设计

3D打印机安装好后&#xff0c;需要的软件环境&#xff1a; 1. Cura 这类切片软件&#xff1b; 用于将STL等模型文件转换成3D打印的执行指令集&#xff0c;其实就是G-CODE的组合&#xff0c;有些还支持在线调试。 Simplify3D https://download.csdn.net/download/pocean2012…

深度剖析数据在内存中的存储

个人主页&#xff1a;平行线也会相交 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 平行线也会相交 原创 收录于专栏【C/C】 目录1.数据类型详细介绍1.1数据类型介绍1.2类型的基本归类2.整型在内存中的存储3.大小端字节序介绍及判断什么是大端小端&#x…

[附源码]Python计算机毕业设计茶叶产品质量安全可追溯系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

尚医通 (二十八) --------- 医院管理相关 (引入注册中心、远程调用)

目录一、医院管理医院管理效果展示二、注册中心与服务调用1. Nacos 概述2. 注册服务三、医院管理实现1. 医院列表2. service-cmn 模块提供接口3. 封装 Feign 服务调用4. 医院接口远程调用数据字典5. 添加数据字典显示接口6. 医院列表前端一、医院管理 目前我们把医院、科室和排…

函数栈帧的创建和销毁

“总有人间一两风&#xff0c; 填我十万八千梦” &#x1f351;作者&#xff1a;小赛毛 &#x1f495;文章初次日期&#xff1a;2022/11/21 目录 函数栈帧解决了什么问题&#xff1f; 什么是栈&#xff1f; 什么是寄存器&#xff1f; 函数栈帧的创建和销毁 预热知识准备&a…

Flink DataStream API 介绍

Flink DataStream API 介绍 StreamExecutionEnvironment #mermaid-svg-JKeWa22W2vWA4zBS {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-JKeWa22W2vWA4zBS .error-icon{fill:#552222;}#mermaid-svg-JKeWa22W2vWA4z…

使用element-ui实现树形穿梭框

<template><div class"transferTreeBox"><!-- 左侧待选内容 --><div class"SelectBox"><div class"boxTitle" click"clickAllSelect">全选 ></div><div class"boxCenter"><…

【Hack The Box】Linux练习-- Frolic

HTB 学习笔记 【Hack The Box】Linux练习-- Frolic &#x1f525;系列专栏&#xff1a;Hack The Box &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4c6;首发时间&#xff1a;&#x1f334;2022年9月7日&#x1f334; &#x1f36d…

dumi 2,它来了它来了它来了

dumi 1.0 在 2020 年 3 月 2 日正式发布&#xff0c;到今天一共有 80 位 Contributor、提交 1100 Commit、为近 4000 个开源项目提供了组件库/站点的文档方案&#xff1b;dumi 作为一个 GitHub 数亿开源项目中的渺小一粒&#xff0c;能有这么多人共同参与、能为这么多项目提供价…

【JAVA程序设计】(C00097) 基于SSM的果树溯源可视化管理系统

基于SSM的果树溯源可视化管理系统项目简介项目获取开发环境项目技术运行截图项目简介 基于ssm框架的果树溯源可视化管理系统&#xff0c;本系统分为二种用户&#xff1a;管理员、农户 管理员角色包含以下功能&#xff1a; 登录、农户管理、商家管理、果树管理、地块管理、农资…

马上2023年了,终于发现一款颜值爆表的记账软件

不知道大家平时有没有记账的习惯&#xff0c;我是在疫情之后&#xff0c;才开始记账的。 记账之后&#xff0c;的确发现了很多问题。尤其是自己花钱大手大脚没有规划的毛病。 后来&#xff0c;在每个月第1周&#xff0c;我都会分析一下上一个月的账目&#xff0c;看看自己的收…

同花顺_代码解析_交易系统_J09_18

本文通过对同花顺中现成代码进行解析&#xff0c;用以了解同花顺相关策略设计的思想 目录 J_09 抛物线转向系统 J_10 均线系统 J_11 随机指标专家 J_12 顺势指标 J_15 动量线 J_16 心理线 J_17 变动速率 J_18 相对强弱指标 J_09 抛物线转向系统 指标标识由绿变红时为买…

LeetCode287之寻找重复数(相关话题:二分查找,快慢指针)

题目描述 给定一个包含 n 1 个整数的数组 nums &#xff0c;其数字都在 [1, n] 范围内&#xff08;包括 1 和 n&#xff09;&#xff0c;可知至少存在一个重复的整数。 假设 nums 只有 一个重复的整数 &#xff0c;返回 这个重复的数 。 你设计的解决方案必须 不修改 数组 …

【SIFT】超详详详解 - 实现细节记录

目录前言一、尺度空间的生成&#xff1a;高斯金字塔 Gaussian pyrmid1、图像的尺度空间 - 高斯金字塔 Gaussian pyramid2、高斯金字塔的组 与 组数 Octave1&#xff09;组2&#xff09;组数3&#xff09;升采样获得 base image3、高斯金字塔的层与层数 interval31&#xff09;层…

2022年轨道交通行业研究报告

第一章 行业概况 轨道交通是指运营车辆需要在特定轨道上行驶的一类交通工具或运输系统。最典型的轨道交通就是由传统火车和标准铁路所组成的铁路系统。随着火车和铁路技术的多元化发展&#xff0c;轨道交通呈现出越来越多的类型&#xff0c;不仅遍布于长距离的陆地运输&#x…

k8s基础命令及Linux上用Kubectl(k8s)部署Nginx

k8s基础命令及Linux上用Kubectl(k8s)部署Nginx 不懂K8s搭建的可以看我这篇文章 Linux上部署Kubectl(k8s) 1.k8s简介 1.1 Kubernetes 概念 在 k8s 上进行部署前&#xff0c;首先需要了解一个基本概念 Deployment Deployment 译名为 部署。在k8s中&#xff0c;通过发布 Depl…