注:本文的代码实现使用的是 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. 相交链表相关推荐

  1. 力扣题目——143. 重排链表

    注:本文的代码实现使用的是 JS(JavaScript),为前端中想使用JS练习算法和数据结构的小伙伴提供解题思路. 描述 给定一个单链表 L 的头节点 head ,单链表 L 表示为: L0→L1→ ...

  2. LeetCode-链表-160. 相交链表

    160. 相交链表 思路一:使用set用到了额外的内存,没有达到题目要求 /*** Definition for singly-linked list.* struct ListNode {* int ...

  3. 力扣 两两交换链表中的节点

    力扣 两两交换链表中的节点 题目描述 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表. 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换. 示例: 给定 1->2-> ...

  4. 【Leetcode】拿捏链表(四)——160. 相交链表、141. 环形链表、142. 环形链表 II

    作者:一个喜欢猫咪的的程序员 专栏:<Leetcode> 喜欢的话:世间因为少年的挺身而出,而更加瑰丽.                                  --<人民 ...

  5. 力扣刷题——单链表系列——第一题:移除链表元素,从此链表初窥门径,神挡杀神~

    题目链接:力扣 力扣刷题------>单链表系列 第一种解法:在原链表上进行操作,小红日烧脑版 /*** Definition for singly-linked list.* public c ...

  6. LeetCode Algorithm 160. 相交链表

    160. 相交链表 Ideas 这题之前左神算法课的时候也讲过,那是一个带环的相交链表,不过原理都是一样的. 双指针,a指针先沿着headA开始走,走到头之后开始沿着headB继续走,b指针先沿着he ...

  7. 160. 相交链表 golang

    160. 相交链表 计算两个链表长度,让长的先走到两个链表一样长,然后找交点 编写一个程序,找到两个单链表相交的起始节点. 如下面的两个链表: 在节点 c1 开始相交. 示例 1: 输入:inters ...

  8. 【LeetCode】【HOT】160. 相交链表

    [LeetCode][HOT]160. 相交链表 文章目录 [LeetCode][HOT]160. 相交链表 package hot;class ListNode{int val;ListNode n ...

  9. 力扣题目——429. N 叉树的层序遍历

    注:本文的代码实现使用的是 JS(JavaScript),为前端中想使用JS练习算法和数据结构的小伙伴提供解题思路. 描述 给定一个 N 叉树,返回其节点值的层序遍历.(即从左到右,逐层遍历). 树的 ...

最新文章

  1. MonkeyRunner 的使用一
  2. Nature、Science的绘图新宠,博导人论文覆盖率高达78%...
  3. 英特尔cpu发布时间表_10纳米来了:英特尔十一代酷睿,性能升20%,AI算力乘5倍...
  4. sql里如何for循环
  5. html三列布局源码,HTML三列布局 - 黄柳淞的个人页面 - OSCHINA - 中文开源技术交流社区...
  6. r语言中的while循环_R编程中的While循环
  7. Halcon和Opencv区别
  8. ERROR 1010 (HY000): Error dropping database (can't rmdir './myapp', errno: 39)
  9. CSS引用LCD 字体 简单倒计时功能
  10. python好友信息管理系统
  11. Linux系统——sqlist数据库
  12. 基于Xposed修改微信运动步数
  13. c语言printf输出格式
  14. 利用线性回归预测波士顿房价
  15. 1一9数字行书写法_1一9数字行书写法
  16. iOS 录视频,相册选择视频,视频压缩,存储本地文件,播放,上传
  17. SQL中cast和convert的区别
  18. 什么是集体户口,优势、劣势
  19. 2017 ccpc网络赛 1001 Vertex Cover(二分图 构造)HDU6150
  20. linux系统安装python包

热门文章

  1. thttpd支持php吗,轻量型thttpd+php5
  2. glMatrixMode()函数
  3. C#路径中获取文件全路径、目录、扩展名、文件名称
  4. 关于如何在Listener中注入service和ServletContextListener源码分析
  5. 简析面向对象中的继承,原型链,闭包之继承
  6. cocoachina上很酷的帖子
  7. 【无线也安全】屏蔽蹭网一族
  8. centos7部署posgresql和kong总结
  9. if 语句 写了return 报错
  10. leveldb 安装及使用