160.相交链表-python
160.相交链表(简单)
题目大意:
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。
进阶:你能否设计一个时间复杂度 O(m + n) 、仅用 O(1) 内存的解决方案?
题目
给你两个单链表的头节点headA
和headB
,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回null
。
图示两个链表在节点c1
开始相交:
题目数据 保证 整个链式结构中不存在环。
注意,函数返回结果后,链表必须 保持其原始结构 。
自定义评测:
评测系统 的输入如下(你设计的程序 不适用 此输入):
intersectVal
- 相交的起始节点的值。如果不存在相交节点,这一值为0
listA
- 第一个链表listB
- 第二个链表skipA
- 在listA
中(从头节点开始)跳到交叉节点的节点数skipB
- 在listB
中(从头节点开始)跳到交叉节点的节点数
评测系统将根据这些输入创建链式数据结构,并将两个头节点 headA 和 headB 传递给你的程序。如果程序能够正确返回相交节点,那么你的解决方案将被 视作正确答案 。
示例1:
1 |
|
示例2:
1 |
|
示例3:
1 |
|
提示:
listA
中节点数目为m
listB
中节点数目为n
1 <= m, n <= 3 * 104
1 <= Node.val <= 105
0 <= skipA <= m
0 <= skipB <= n
- 如果
listA
和listB
没有交点,intersectVal
为0
- 如果
listA
和listB
有交点,intersectVal == listA[skipA] == listB[skipB]
分析和解答
这个题在面试的时候曾经被问过,判断两个链表是否有交有很多种方法,如果只是判断是否有交的话,最简单的方法就是两个链表都分别走到结尾处,如果结尾处是一样的,那么就判断两个链表在之前一定有交了;
这个题要求判断并找到两个链表相交的位置,一种非常简单的思路是把每个地方都存到一个字典里,这样找一下就行了,但是题目的附加要求是O(1)的时间复杂度,所以说不能这么做;
下边这个图也是看了题解后才明白的,这样最多走a+b这个长度的次数,两个走的长度是一样的,如果有交集则必定能相交!
1 |
|
复习单链表的一个写法
1 |
|
160.相交链表-python
http://example.com/2022/01/17/algorithms/leetcode-python/160-相交链表-python/