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 为: A + C,链表 2 为: B + C
当 a 指针将链表 1 遍历完后,重定位到链表 B 的头结点,然后继续遍历直至相交点(a 指针遍历的距离为 A + C + B)
同理 b 指针遍历的距离为 B + C + A
伪代码
代码支持: JS, Python, Go, PHP
JS Code:
Python Code:
Go Code:
PHP Code:
复杂度分析
时间复杂度:$O(N)$
空间复杂度:$O(1)$
最后更新于
这有帮助吗?