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

day19【LeetCode力扣】160.相交链表

day19【LeetCode力扣】160.相交链表

1.题目描述

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

图示两个链表在节点 c1 开始相交**:**
在这里插入图片描述
题目数据 保证 整个链式结构中不存在环。

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

自定义评测:

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

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

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

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

2.题解

双指针

c++

方法一:传统解法

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode(int x) : val(x), next(NULL) {}* };*/
class Solution {
public:ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {ListNode* curA=headA;ListNode* curB=headB;int lenA=0,lenB=0;while(curA){lenA++;curA=curA->next;}while(curB){lenB++;curB=curB->next;}curA=headA;curB=headB;if(lenB>lenA){swap(lenA,lenB);swap(curA,curB);}int gap=lenA-lenB;while(gap--){curA=curA->next;}while(curA){if(curA==curB)return curA;curA=curA->next;curB=curB->next;}return NULL;}
};

方法二:双指针(妙不可言的:官方题解给的)

一句话说明算法核心:终究会相遇

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode(int x) : val(x), next(NULL) {}* };*/
class Solution {
public:ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {if(headA==nullptr||headB==nullptr)return NULL;ListNode *pA=headA,*pB=headB;while(pA!=pB){pA=pA==nullptr?headB:pA->next;pB=pB==nullptr?headA:pB->next;}return pA;}
};

python

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = Noneclass Solution:def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> Optional[ListNode]:curA=headAcurB=headBlenA,lenB=0,0while curA:lenA+=1curA=curA.nextwhile curB:lenB+=1curB=curB.nextcurA=headAcurB=headBif lenB>lenA:lenA,lenB=lenB,lenAcurA,curB=curB,curAfor _ in range(lenA-lenB):curA=curA.nextwhile(curA):if curA==curB:return curAcurA=curA.nextcurB=curB.nextreturn None

如果觉得作者写的不错,求给博主一个大大的点赞支持一下,你们的支持是我更新的最大动力!

如果觉得作者写的不错,求给博主一个大大的点赞支持一下,你们的支持是我更新的最大动力!

如果觉得作者写的不错,求给博主一个大大的点赞支持一下,你们的支持是我更新的最大动力!

n和c++类似,代码就不再重复用了。

如果觉得作者写的不错,求给博主一个大大的点赞支持一下,你们的支持是我更新的最大动力!

如果觉得作者写的不错,求给博主一个大大的点赞支持一下,你们的支持是我更新的最大动力!

如果觉得作者写的不错,求给博主一个大大的点赞支持一下,你们的支持是我更新的最大动力!

相关文章:

  • 【数据结构】排序之归并排序与计数排序
  • MySQL深入——13
  • MYSQL单表查询
  • Vue Axios——前端技术栈
  • C语言——小细节和小知识9
  • 【论文阅读】Consistency Models
  • 最新AI绘画Midjourney绘画提示词Prompt大全
  • Java http 响应式请求和非响应式请求有什么区别
  • Spring Boot - Application Events 的发布顺序_ApplicationFailedEvent
  • 10个常见的async/await函数
  • Qt根据单价计算总价与进制转换
  • TCP之三次握手四次挥手与UDP区别
  • 机器学习算法汇总:人工神经网络、深度学习及其它
  • 【Python数据可视化】matplotlib之设置子图:绘制子图、子图共享x轴坐标、调整子图间距、设置图片大小
  • 数据可视化|Python之Pyecharts将“爬虫数据”绘制饼状图
  • [译]如何构建服务器端web组件,为何要构建?
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • java8-模拟hadoop
  • Python爬虫--- 1.3 BS4库的解析器
  • Vue UI框架库开发介绍
  • Vue.js源码(2):初探List Rendering
  • vue--为什么data属性必须是一个函数
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 从0实现一个tiny react(三)生命周期
  • 关于springcloud Gateway中的限流
  • 基于遗传算法的优化问题求解
  • 那些被忽略的 JavaScript 数组方法细节
  • 前端技术周刊 2019-01-14:客户端存储
  • 如何使用 OAuth 2.0 将 LinkedIn 集成入 iOS 应用
  • 如何邀请好友注册您的网站(模拟百度网盘)
  • Java总结 - String - 这篇请使劲喷我
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • #1015 : KMP算法
  • #使用清华镜像源 安装/更新 指定版本tensorflow
  • #我与Java虚拟机的故事#连载01:人在JVM,身不由己
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (4)STL算法之比较
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (规划)24届春招和25届暑假实习路线准备规划
  • (亲测有效)解决windows11无法使用1500000波特率的问题
  • (三)终结任务
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (太强大了) - Linux 性能监控、测试、优化工具
  • (原創) 系統分析和系統設計有什麼差別? (OO)
  • (转)shell中括号的特殊用法 linux if多条件判断
  • .libPaths()设置包加载目录
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
  • .net 7 上传文件踩坑
  • .NET C#版本和.NET版本以及VS版本的对应关系
  • .Net Core 中间件验签
  • .NET Core日志内容详解,详解不同日志级别的区别和有关日志记录的实用工具和第三方库详解与示例
  • .NET Remoting学习笔记(三)信道
  • .Net 转战 Android 4.4 日常笔记(4)--按钮事件和国际化