Menu
CoddyTech

Intersection of Two Linked Lists

两个单向链表共用一个节点池。节点 i 指向节点 next[i],-1 表示链表结束。链表 A 从节点 headA 开始,链表 B 从节点 headB 开始。节点的存储顺序没有规律,因此请沿着链接查找。

两个链表可能会相交:从某个节点开始,它们会经过相同的节点直到末尾。返回第一个同时属于两个链表的节点的索引;如果它们没有共同节点,则返回 -1。

函数

getIntersectionNode(next: integer-array, headA: integer, headB: integer) → integer
nextinteger-array
每个节点链接到的节点的索引,或者列表中最后一个节点对应的 -1
headAinteger
列表 A 的第一个节点
headBinteger
B 列表的第一个节点
返回值integer
两个列表共同拥有的第一个节点,如果没有则为 -1

约束条件

  • 2 ≤ n ≤ 104,其中 n 是 next 的长度。
  • 每个 next[i] 要么是 -1,要么是从 0 到 n-1 的节点索引。
  • 0 ≤ headA, headB ≤ n-1,并且 headA ≠ headB。
  • 两个列表都在到达 -1 时结束,且不会重复访问任何节点。不存在环。
  • 每个节点都在列表 A 中、列表 B 中,或同时在两个列表中。

示例

输入
next = [-1, 4, 1, 5, 0, 1]headA = 3headB = 2
输出
1
解释
A 访问 3, 5, 1, 4, 0,B 访问 2, 1, 4, 0。从节点 1 开始,它们访问的每个节点都相同,而 A 更早访问的节点都不在 B 的路径上,所以答案是 1。
challenge icon

进阶

你能否在 O(m + k) 时间内找到该节点,并且只使用 O(1) 额外内存?

重置代码
def getIntersectionNode(next, headA, headB):
    # 在这里编写代码

测试 #1

测试 #2

测试 #3

参数

next = [-1, 4, 1, 5, 0, 1]
headA = 3
headB = 2

预期输出

1