要点:链表、双指针
描述
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。
题目数据 保证 整个链式结构中不存在环。
注意,函数返回结果后,链表必须 保持其原始结构 。
1 | 示例 1: |
提示:
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]
进阶:你能否设计一个时间复杂度 O(n) 、仅用 O(1) 内存的解决方案?
方法一、哈希表
有 A, B 这两条链表, 先遍历其中一个,比如 A 链表, 并将 A 中的所有节点存入哈希表。
遍历 B 链表,检查节点是否在哈希表中, 第一个存在的就是相交节点
1 | /** |
- 39/39 cases passed (96 ms)
- Your runtime beats 51.95 % of javascript submissions
- Your memory usage beats 12.81 % of javascript submissions (45.6 MB)
时间复杂度:$O(N)$
空间复杂度:$O(N)$
方法二、双指针
例如使用 a, b 两个指针分别指向 A, B 这两条链表, 两个指针相同的速度向后移动,
-
当 a 到达链表的尾部时,重定位到链表 B 的头结点
-
当 b 到达链表的尾部时,重定位到链表 A 的头结点。
-
a, b 指针相遇的点为相交的起始节点,否则没有相交点
1 | /** |
- 39/39 cases passed (876 ms) ???
- Your runtime beats 5.02 % of javascript submissions ???
- Your memory usage beats 53.9 % of javascript submissions (44.4 MB) ???
时间复杂度:$O(N)$
空间复杂度:$O(1)$
Tips: Please indicate the source and original author when reprinting or quoting this article.