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 个节点。
示例 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]
进阶:你能否设计一个时间复杂度 O(m + n) 、仅用 O(1) 内存的解决方案?
来源:力扣(LeetCode)
解题思路
看完这道题的题目,假设现在再给定一个条件,比如A比B长多少,或者B比A长多少,那就好做多了;如果有了这个条件我们就可以直接让两个链表同步走一样的路,如果相交就能立马发现,但遗憾的是并没有这么一个好的条件。所谓没有条件就需要创造条件,我们需要想办法比出个长短来,比如,平时下跳跳棋的时候一方已经获胜,那么另一方如果想知道差距的话就需要计算自己还需要多少步能够完成,在这里也是一样,我们可以让两个链表同步遍历,一旦有一方到达了终点,那么我们开始清算另一方还需要多少步才能到达终点,需要多少步那就是我们所假设的条件了。得到这个条件我们让比较长的那一个链先走上那么几步,然后两个链再开始同步遍历,这个时候就比较好查找相交的结点了。
# 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) -> ListNode:p1=headAp2=headBcount=0flag=1 #A与B长短标记,A长于B为1,B长于A为0while p1 and p2:if p1==p2: #如果AB一样长且有交点的话一遍遍历便可以找到交点return p1p1=p1.nextp2=p2.nextwhile p1: #第一遍同步遍历完当A还有剩余时计算还需多少步flag=1count+=1p1=p1.nextwhile p2: #第一遍同步遍历完当B还有剩余时计算还需多少步flag=0count+=1p2=p2.nextif flag:for i in range(count): #A长的话先让A走几步headA=headA.nextelse:for i in range(count): #B长的话先让B走几步headB=headB.nextwhile headA:if headA==headB: #如果找到相交的结点返回即可return headAheadA=headA.nextheadB=headB.next
LeetCode简单题之相交链表相关推荐
- leetcode刷题:相交链表
题目: 分析: 判断两个链表是否相交,可以使用哈希集合存储链表节点. 首先遍历链表 \textit{headA}headA,并将链表 \textit{headA}headA 中的每个节点加入哈希集合中 ...
- 【leetcode刷题日记】链表
各个数据结构和算法的链接总结如下: 待补充. 链表 总结:本部分内容其实就是考察对指针的操作.通过指针会改变对象指向的方向,这些都是需要注意.有一些技巧,类似于快慢指针,加一个脑袋(哨兵/头节点),h ...
- LeetCode刷题---707. 设计链表(双向链表-带头尾双结点)
文章目录 一.编程题:707. 设计链表(双向链表-带头尾双结点) 1.题目描述 2.示例1: 3.提示: 二.解题思路 1.思路 2.复杂度分析: 3.算法图解(双向链表) 三.代码实现 三.单向链 ...
- LeetCode简单题之合并两个链表
题目 给你两个链表 list1 和 list2 ,它们包含的元素分别为 n 个和 m 个. 请你将 list1 中下标从 a 到 b 的全部节点都删除,并将list2 接在被删除节点的位置. 下图中蓝 ...
- LeetCode简单题之判断路径是否相交
题目 给你一个字符串 path,其中 path[i] 的值可以是 'N'.'S'.'E' 或者 'W',分别表示向北.向南.向东.向西移动一个单位. 你从二维平面上的原点 (0, 0) 处开始出发,按 ...
- LeetCode简单题之删除排序链表中的重复元素
题目 给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 .返回 已排序的链表 . 示例 1: 输入:head = [1,1,2] 输出:[1,2] 示例 2: 输入:h ...
- LeetCode简单题之基于排列构建数组
题目 给你一个 从 0 开始的排列 nums(下标也从 0 开始).请你构建一个 同样长度 的数组 ans ,其中,对于每个 i(0 <= i < nums.length),都满足 ans ...
- LeetCode简单题之Excel 表中某个范围内的单元格
题目 Excel 表中的一个单元格 (r, c) 会以字符串 "" 的形式进行表示,其中: 即单元格的列号 c .用英文字母表中的 字母 标识. 例如,第 1 列用 'A' 表示, ...
- LeetCode简单题之增量元素之间的最大差值
题目 给你一个下标从 0 开始的整数数组 nums ,该数组的大小为 n ,请你计算 nums[j] - nums[i] 能求得的 最大差值 ,其中 0 <= i < j < n 且 ...
最新文章
- python中set函数_python中的set函数、列表的操作
- java.lang.Math
- lamp/lnmp开启 PATHINFO
- Redis的入门(一)安装,设置密码
- 碎片化趋势下手机浏览器或成赢家
- 【转】Asp.Net中Excel操作权限的问题
- 什么?面试官问我Java内存模型!这不得给我加薪?
- linux 运行jar main,Maven打包生成jar包并在linux下启动main方法
- 文字和表单(checkbox/radio)元素垂直对齐方法,兼容Firefox和IE。
- 使用STM32固件库开发GD32 汇总
- MySQL导入数据遇到Error Number: 1467 Failed to read auto-increment value from storage engine错误
- Ae:文本动画制作器
- vmbox 导入虚拟电脑之后无法上网
- 普及游戏:小型团队如何赢得大赛
- 防火墙和NAT基础学习
- CASS或BMF软件命令栏不见了如何调出
- div滚动条样式css3,CSS3自定义滚动条样式的示例详解
- matlab考试试卷
- UGUI-- Scrollview 滚动视图
- Threejs画椭圆