力扣题目——160. 相交链表
注:本文的代码实现使用的是 JS(JavaScript),为前端中想使用JS练习算法和数据结构的小伙伴提供解题思路。
描述
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。题目数据保证整个链式结构中不存在环。
图示两个链表在节点 c1 开始相交:
注意,函数返回结果后,链表必须保持其原始结构 。
示例:
输入: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 个节点。
提示:
- listA 中节点数目为 m
- listB 中节点数目为 n
- 0 <= m, n <= 3 * 104
- 1 <= Node.val <= 105
- 0 <= skipA <= m
- 0 <= skipB <= n
- 如果 listA 和 listB 没有交点,intersectVal 为 0
- 如果 listA 和 listB 有交点,intersectVal == listA[skipA + 1] == listB[skipB + 1]
解题思路
哈希法
创建一个哈希表,然后依次存放其中一个链表的所有节点。随后遍历另一个链表,遍历的时候判断当前节点是否在哈希表中出现过,若出现,则为交点,若遍历结束,则返回null
var getIntersectionNode = function(headA, headB) {let setA = new Set()let pA = headAlet pB = headB// 将 A 链表中的每个节点都放到集合中while(pA){setA.add(pA)pA = pA.next}// 检测 B 中的节点是否曾经在 A 中出现while(pB){if(setA.has(pB)) return pBpB = pB.next}return null
};
双指针法
记A独有的节点数为a
,B独有的节点数为b
,交点及其之后的节点数为c
(即A和B共享的节点)。
我们可以使用两个指针,分别指向A和B,依次遍历,遍历完自己的节点后遍历对方的节点。若某个时刻两个指针所指向的节点相同,则存在相交节点。
举例:假设相交节点存在。初始指向链表A 的指针为pA,遍历完后,走了a+c
步,此时将pA指向链表B的头节点,若想pA走到交点,需要再走b
步,累计走过了a+c+b
步;同理,始指向链表B 的指针为pB,遍历完后,走了b+c
步,此时将pB指向链表A的头节点,若想pB走到交点,需要再走a
步,需要走过b+c+a
步,此时正好步数一样。
var getIntersectionNode = function(headA, headB) {if(!headA || !headB) return nulllet pA = headA, pB = headBwhile(pA !== pB){pA = pA === null ? headB : pA.nextpB = pB === null ? headA : pB.next}return pA
};
力扣题目——160. 相交链表相关推荐
- 力扣题目——143. 重排链表
注:本文的代码实现使用的是 JS(JavaScript),为前端中想使用JS练习算法和数据结构的小伙伴提供解题思路. 描述 给定一个单链表 L 的头节点 head ,单链表 L 表示为: L0→L1→ ...
- LeetCode-链表-160. 相交链表
160. 相交链表 思路一:使用set用到了额外的内存,没有达到题目要求 /*** Definition for singly-linked list.* struct ListNode {* int ...
- 力扣 两两交换链表中的节点
力扣 两两交换链表中的节点 题目描述 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表. 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换. 示例: 给定 1->2-> ...
- 【Leetcode】拿捏链表(四)——160. 相交链表、141. 环形链表、142. 环形链表 II
作者:一个喜欢猫咪的的程序员 专栏:<Leetcode> 喜欢的话:世间因为少年的挺身而出,而更加瑰丽. --<人民 ...
- 力扣刷题——单链表系列——第一题:移除链表元素,从此链表初窥门径,神挡杀神~
题目链接:力扣 力扣刷题------>单链表系列 第一种解法:在原链表上进行操作,小红日烧脑版 /*** Definition for singly-linked list.* public c ...
- LeetCode Algorithm 160. 相交链表
160. 相交链表 Ideas 这题之前左神算法课的时候也讲过,那是一个带环的相交链表,不过原理都是一样的. 双指针,a指针先沿着headA开始走,走到头之后开始沿着headB继续走,b指针先沿着he ...
- 160. 相交链表 golang
160. 相交链表 计算两个链表长度,让长的先走到两个链表一样长,然后找交点 编写一个程序,找到两个单链表相交的起始节点. 如下面的两个链表: 在节点 c1 开始相交. 示例 1: 输入:inters ...
- 【LeetCode】【HOT】160. 相交链表
[LeetCode][HOT]160. 相交链表 文章目录 [LeetCode][HOT]160. 相交链表 package hot;class ListNode{int val;ListNode n ...
- 力扣题目——429. N 叉树的层序遍历
注:本文的代码实现使用的是 JS(JavaScript),为前端中想使用JS练习算法和数据结构的小伙伴提供解题思路. 描述 给定一个 N 叉树,返回其节点值的层序遍历.(即从左到右,逐层遍历). 树的 ...
最新文章
- MonkeyRunner 的使用一
- Nature、Science的绘图新宠,博导人论文覆盖率高达78%...
- 英特尔cpu发布时间表_10纳米来了:英特尔十一代酷睿,性能升20%,AI算力乘5倍...
- sql里如何for循环
- html三列布局源码,HTML三列布局 - 黄柳淞的个人页面 - OSCHINA - 中文开源技术交流社区...
- r语言中的while循环_R编程中的While循环
- Halcon和Opencv区别
- ERROR 1010 (HY000): Error dropping database (can't rmdir './myapp', errno: 39)
- CSS引用LCD 字体 简单倒计时功能
- python好友信息管理系统
- Linux系统——sqlist数据库
- 基于Xposed修改微信运动步数
- c语言printf输出格式
- 利用线性回归预测波士顿房价
- 1一9数字行书写法_1一9数字行书写法
- iOS 录视频,相册选择视频,视频压缩,存储本地文件,播放,上传
- SQL中cast和convert的区别
- 什么是集体户口,优势、劣势
- 2017 ccpc网络赛 1001 Vertex Cover(二分图 构造)HDU6150
- linux系统安装python包