5
5
6
6
## 题目大意
7
7
8
- 给定 A、B 两个链表,判断两个链表是否相交,返回相交的起始点。如果不相交,则返回 None 。
8
+ ** 描述 ** : 给定 ` listA ` 、 ` listB ` 两个链表。
9
9
10
- 比如:链表 A 为 [ 4, 1, 8, 4, 5] ,链表 B 为 [ 5, 0, 1, 8, 4, 5] 。则如下图所示,两个链表相交的起始节点为 8,则输出结果为 8。
10
+ ** 要求** :判断两个链表是否相交,返回相交的起始点。如果不相交,则返回 ` None ` 。
11
+
12
+ ** 说明** :
13
+
14
+ - ` listA ` 中节点数目为 $m$。
15
+ - ` listB ` 中节点数目为 $n$。
16
+ - 1ドル \le m, n \le 3 * 10^4$。
17
+ - 1ドル \le Node.val \le 10^5$。
18
+ - 0ドル \le skipA \le m$。
19
+ - 0ドル \le skipB \le n$。
20
+ - 如果 ` listA ` 和 ` listB ` 没有交点,` intersectVal ` 为 0ドル$。
21
+ - 如果 ` listA ` 和 ` listB ` 有交点,` intersectVal == listA[skipA] == listB[skipB] ` 。
22
+
23
+ ** 示例** :
24
+
25
+ - 示例 1:
11
26
12
27
![ ] ( https://assets.leetcode.com/uploads/2018/12/13/160_example_1.png )
13
28
29
+ ``` Python
30
+ 输入:intersectVal = 8 , listA = [4 ,1 ,8 ,4 ,5 ], listB = [5 ,6 ,1 ,8 ,4 ,5 ], skipA = 2 , skipB = 3
31
+ 输出:Intersected at ' 8'
32
+ 解释:相交节点的值为 8 (注意,如果两个链表相交则不能为 0 )。
33
+ 从各自的表头开始算起,链表 A 为 [4 ,1 ,8 ,4 ,5 ],链表 B 为 [5 ,6 ,1 ,8 ,4 ,5 ]。
34
+ 在 A 中,相交节点前有 2 个节点;在 B 中,相交节点前有 3 个节点。
35
+ — 请注意相交节点的值不为 1 ,因为在链表 A 和链表 B 之中值为 1 的节点 (A 中第二个节点和 B 中第三个节点) 是不同的节点。换句话说,它们在内存中指向两个不同的位置,而链表 A 和链表 B 中值为 8 的节点 (A 中第三个节点,B 中第四个节点) 在内存中指向相同的位置。
36
+ ```
14
37
38
+ - 示例 2:
15
39
40
+ ![ ] ( https://assets.leetcode.com/uploads/2021/03/05/160_example_2.png )
16
41
42
+ ``` Python
43
+ 输入:intersectVal = 2 , listA = [1 ,9 ,1 ,2 ,4 ], listB = [3 ,2 ,4 ], skipA = 3 , skipB = 1
44
+ 输出:Intersected at ' 2'
45
+ 解释:相交节点的值为 2 (注意,如果两个链表相交则不能为 0 )。
46
+ 从各自的表头开始算起,链表 A 为 [1 ,9 ,1 ,2 ,4 ],链表 B 为 [3 ,2 ,4 ]。
47
+ 在 A 中,相交节点前有 3 个节点;在 B 中,相交节点前有 1 个节点。
48
+ ```
17
49
18
50
## 解题思路
19
51
20
- 如果两个链表相交,那么从相交位置开始,到结束,必有一段等长且相同的节点。假设链表 A 的长度为 m、链表 B 的长度为 n,他们的相交序列有 k 个,则相交情况可以如下如所示:
52
+ ### 思路 1:双指针
53
+
54
+ 如果两个链表相交,那么从相交位置开始,到结束,必有一段等长且相同的节点。假设链表 ` listA ` 的长度为 $m$、链表 ` listB ` 的长度为 $n,ドル他们的相交序列有 $k$ 个,则相交情况可以如下如所示:
21
55
22
- ![ ] ( http ://qncdn.bujige.net /images/20210401113538.png)
56
+ ![ ] ( https ://qcdn.itcharge.cn /images/20210401113538.png)
23
57
24
- 现在问题是如何找到 m-k 或者 n-k 的位置。
58
+ 现在问题是如何找到 $m - k$ 或者 $n - k$ 的位置。
25
59
26
- 考虑将链表 A 的末尾拼接上链表 B ,链表 B 的末尾拼接上链表 A 。
60
+ 考虑将链表 ` listA ` 的末尾拼接上链表 ` listB ` ,链表 ` listB ` 的末尾拼接上链表 ` listA ` 。
27
61
28
- 然后使用两个指针 pA 、PB ,分别从链表 A 、链表 B 的头节点开始遍历,如果走到共同的节点,则返回该节点。
62
+ 然后使用两个指针 ` pA ` 、 ` pB ` ,分别从链表 ` listA ` 、链表 ` listB ` 的头节点开始遍历,如果走到共同的节点,则返回该节点。
29
63
30
- 否则走到两个链表末尾,返回 None。
64
+ 否则走到两个链表末尾,返回 ` None ` 。
31
65
32
- ![ image-20210401114058127 ] ( http ://qncdn.bujige.net /images/20210401114100.png)
66
+ ![ ] ( https ://qcdn.itcharge.cn /images/20210401114100.png)
33
67
34
- ##代码
68
+ ### 思路 1: 代码
35
69
36
70
``` Python
37
71
class Solution :
@@ -40,9 +74,14 @@ class Solution:
40
74
return None
41
75
pA = headA
42
76
pB = headB
43
- while pA != pB:
77
+ while pA != pB:
44
78
pA = pA.next if pA != None else headB
45
79
pB = pB.next if pB != None else headA
46
80
return pA
47
81
```
48
82
83
+ ### 思路 1:复杂度分析
84
+
85
+ - ** 时间复杂度** :$O(m + n)$。
86
+ - ** 空间复杂度** :$O(1)$。
87
+
0 commit comments