【力扣160】相交链表
题目
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。
图示两个链表在节点 c1 开始相交:
题目数据 保证 整个链式结构中不存在环。
注意,函数返回结果后,链表必须 保持其原始结构 。
自定义评测:
评测系统 的输入如下(你设计的程序 不适用 此输入):
intersectVal- 相交的起始节点的值。如果不存在相交节点,这一值为0listA- 第一个链表listB- 第二个链表skipA- 在listA中(从头节点开始)跳到交叉节点的节点数skipB- 在listB中(从头节点开始)跳到交叉节点的节点数
评测系统将根据这些输入创建链式数据结构,并将两个头节点 headA 和 headB 传递给你的程序。如果程序能够正确返回相交节点,那么你的解决方案将被 视作正确答案 。
示例 1:
1 | 输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,6,1,8,4,5], skipA = 2, skipB = 3 |
示例 2:
1 | 输入:intersectVal = 2, listA = [1,9,1,2,4], listB = [3,2,4], skipA = 3, skipB = 1 |
示例 3:
1 | 输入:intersectVal = 0, listA = [2,6,4], listB = [1,5], skipA = 3, skipB = 2 |
提示:
listA中节点数目为mlistB中节点数目为n1 <= m, n <= 3 * 1041 <= Node.val <= 1050 <= skipA <= m0 <= skipB <= n- 如果
listA和listB没有交点,intersectVal为0 - 如果
listA和listB有交点,intersectVal == listA[skipA] == listB[skipB]
实现代码
方式一
使用哈希表的方式,p1、p2同时移动,任意链表走完暂停等另一个链表,直到发现相同节点,否则没有相交节点
方式二
双指针方式,先看代码
1 | /** |
代码讲解
1 | if (p1 != null) { |
如上代码,链表p1走完headA后,再切换headB继续
为什么这样做就能找到相交节点?
如下图:

假设链表 headA 与链表 headB 的相交节点是 c1,两条链表不同节点的数量不同,headA 有两个,headB 有1个,也就是说,两条链表的长度不一样,但是 headA + headB 与 headB + headA 的长度是一样的,当 p2 已经在 headB 的最后一个节点,继续走 headA 的节点,而当 p1 走完 headA 的节点继续走 headB 的节点时,也就是 m 那条线,这时候 p1 和 p2 走的链表就平衡了,继续往后对比,如果存在相同节点的就能找出来;
时间复杂度
时间:
O(n)
空间复杂度
空间:
O(1)
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 青柠!
评论






















































