0160. 相交链表

题目地址(160. 相交链表)

https://leetcode-cn.com/problems/intersection-of-two-linked-lists/

题目描述

编写一个程序,找到两个单链表相交的起始节点。

前置知识

  • 链表

  • 双指针

解法一: 哈希法

有 A, B 这两条链表, 先遍历其中一个,比如 A 链表, 并将 A 中的所有节点存入哈希表。

遍历 B 链表,检查节点是否在哈希表中, 第一个存在的就是相交节点

  • 伪代码

data = new Set() // 存放A链表的所有节点的地址

while A不为空{
  哈希表中添加A链表当前节点
  A指针向后移动
}

while B不为空{
  if 如果哈希表中含有B链表当前节点
    return B
  B指针向后移动
}

return null // 两条链表没有相交点
  • 代码支持: JS

JS Code:

复杂度分析

  • 时间复杂度:$O(N)$

  • 空间复杂度:$O(N)$

解法二:双指针

  • 例如使用 a, b 两个指针分别指向 A, B 这两条链表, 两个指针相同的速度向后移动,

  • 当 a 到达链表的尾部时,重定位到链表 B 的头结点

  • 当 b 到达链表的尾部时,重定位到链表 A 的头结点。

  • a, b 指针相遇的点为相交的起始节点,否则没有相交点

(图 5)

为什么 a, b 指针相遇的点一定是相交的起始节点? 我们证明一下:

  1. 将两条链表按相交的起始节点继续截断,链表 1 为: A + C,链表 2 为: B + C

  2. 当 a 指针将链表 1 遍历完后,重定位到链表 B 的头结点,然后继续遍历直至相交点(a 指针遍历的距离为 A + C + B)

  3. 同理 b 指针遍历的距离为 B + C + A

  • 伪代码

  • 代码支持: JS, Python, Go, PHP

JS Code:

Python Code:

Go Code:

PHP Code:

复杂度分析

  • 时间复杂度:$O(N)$

  • 空间复杂度:$O(1)$

最后更新于

这有帮助吗?