Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit b8d8e66

Browse files
committed
更新题解列表
1 parent ddb9df1 commit b8d8e66

8 files changed

+144
-26
lines changed

‎Solutions/0023. 合并K个升序链表.md‎

Lines changed: 43 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,50 @@
55

66
## 题目大意
77

8-
给定一个链表数组,每个链表都已经按照升序排列。
8+
**描述**:给定一个链表数组,每个链表都已经按照升序排列。
99

10-
要求:将所有链表合并到一个升序链表中,返回合并后的链表。
10+
**要求**:将所有链表合并到一个升序链表中,返回合并后的链表。
11+
12+
**说明**:
13+
14+
- $k == lists.length$。
15+
- 0ドル \le k \le 10^4$。
16+
- 0ドル \le lists[i].length \le 500$。
17+
- $-10^4 \le lists[i][j] \le 10^4$。
18+
- $lists[i]$ 按升序排列。
19+
- $lists[i].length$ 的总和不超过 10ドル^4$。
20+
21+
**示例**:
22+
23+
- 示例 1:
24+
25+
```Python
26+
输入:lists = [[1,4,5],[1,3,4],[2,6]]
27+
输出:[1,1,2,3,4,4,5,6]
28+
解释:链表数组如下:
29+
[
30+
1->4->5,
31+
1->3->4,
32+
2->6
33+
]
34+
将它们合并到一个有序链表中得到。
35+
1->1->2->3->4->4->5->6
36+
```
37+
38+
- 示例 2:
39+
40+
```Python
41+
输入:lists = []
42+
输出:[]
43+
```
1144

1245
## 解题思路
1346

47+
### 思路 1:分治
48+
1449
分而治之的思想。将链表数组不断二分,转为规模为二分之一的子问题,然后再进行归并排序。
1550

16-
##代码
51+
### 思路 1:代码
1752

1853
```Python
1954
class Solution:
@@ -49,3 +84,8 @@ class Solution:
4984
return self.merge_sort(lists, 0, size - 1)
5085
```
5186

87+
### 思路 1:复杂度分析
88+
89+
- **时间复杂度**:$O(k \times n \times \log_2k)$。
90+
- **空间复杂度**:$O(\log_2k)$。
91+

‎Solutions/0025. K 个一组翻转链表.md‎

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@
5959
6. 最后等到 `cur` 遍历到链表末尾(即 `cur == tail`)时,令「当前待反转区间的第一个节点的前一个节点」指向「反转区间后的头节点」 ,即 `head.next = pre`。令「待反转区间的第一个节点(反转之后为区间的尾节点)」指向「待反转分区间的最后一个节点的后一个节点」,即 `first.next = tail`
6060
7. 最后返回新的头节点 `dummy_head.next`
6161

62-
### 思路 1:迭代代码
62+
### 思路 1:代码
6363

6464
```Python
6565
# Definition for singly-linked list.
@@ -96,3 +96,8 @@ class Solution:
9696
tail = tail.next
9797
return dummy_head.next
9898
```
99+
100+
### 思路 1:复杂度分析
101+
102+
- **时间复杂度**:$O(n)$。其中 $n$ 为链表的总长度。
103+
- **空间复杂度**:$O(1)$。

‎Solutions/0092. 反转链表 II.md‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,11 @@ class Solution:
8383
return dummy_head.next
8484
```
8585

86+
### 思路 1:复杂度分析
87+
88+
- **时间复杂度**:$O(n)$。其中 $n$ 是链表节点个数。
89+
- **空间复杂度**:$O(1)$。
90+
8691
## 参考资料
8792

8893
- 【题解】[动画图解:翻转链表的指定区间 - 反转链表 II - 力扣](https://leetcode.cn/problems/reverse-linked-list-ii/solution/dong-hua-tu-jie-fan-zhuan-lian-biao-de-z-n4px/)

‎Solutions/0143. 重排链表.md‎

Lines changed: 34 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,41 @@
55

66
## 题目大意
77

8-
给定一个单链表 `L` 的头节点 `head`,单链表 `L` 表示为:$L_0$ -> $L_1$ -> $L_2$ -> ... -> $L_{n-1}$ -> $L_n$。
8+
**描述**:给定一个单链表 `L` 的头节点 `head`,单链表 `L` 表示为:$L_0$ -> $L_1$ -> $L_2$ -> ... -> $L_{n-1}$ -> $L_n$。
99

10-
要求:将单链表 `L` 重新排列为:$L_0$ -> $L_n$ -> $L_1$ -> $L_{n-1}$ -> $L_2$ -> $L_{n-2}$ -> $L_3$ -> $L_{n-3}$ -> ...。
10+
**要求**:将单链表 `L` 重新排列为:$L_0$ -> $L_n$ -> $L_1$ -> $L_{n-1}$ -> $L_2$ -> $L_{n-2}$ -> $L_3$ -> $L_{n-3}$ -> ...。
1111

12-
注意:需要将实际节点进行交换。
12+
**说明**:
13+
14+
- 需要将实际节点进行交换。
15+
16+
**示例**:
17+
18+
- 示例 1:
19+
20+
![](https://pic.leetcode-cn.com/1626420311-PkUiGI-image.png)
21+
22+
```Python
23+
输入:head = [1,2,3,4]
24+
输出:[1,4,2,3]
25+
```
26+
27+
- 示例 2:
28+
29+
![](https://pic.leetcode-cn.com/1626420320-YUiulT-image.png)
30+
31+
```Python
32+
输入:head = [1,2,3,4,5]
33+
输出:[1,5,2,4,3]
34+
```
1335

1436
## 解题思路
1537

16-
链表不能像数组那样直接进行随机访问。所以我们可以先将链表转为线性表。然后直接按照提要要求的排列顺序访问对应数据元素,重新建立链表。
38+
### 思路 1:线性表
1739

18-
## 代码
40+
因为链表无法像数组那样直接进行随机访问。所以我们可以先将链表转为线性表,然后直接按照提要要求的排列顺序访问对应数据元素,重新建立链表。
41+
42+
### 思路 1:代码
1943

2044
```Python
2145
class Solution:
@@ -43,3 +67,8 @@ class Solution:
4367
vec[left].next = None
4468
```
4569

70+
### 思路 1:复杂度分析
71+
72+
- **时间复杂度**:$O(n)$。
73+
- **空间复杂度**:$O(n)$。
74+

‎Solutions/0160. 相交链表.md‎

Lines changed: 50 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,33 +5,67 @@
55

66
## 题目大意
77

8-
给定 A、B 两个链表,判断两个链表是否相交,返回相交的起始点。如果不相交,则返回 None
8+
**描述**:给定 `listA``listB` 两个链表。
99

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:
1126

1227
![](https://assets.leetcode.com/uploads/2018/12/13/160_example_1.png)
1328

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+
```
1437

38+
- 示例 2:
1539

40+
![](https://assets.leetcode.com/uploads/2021/03/05/160_example_2.png)
1641

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+
```
1749

1850
## 解题思路
1951

20-
如果两个链表相交,那么从相交位置开始,到结束,必有一段等长且相同的节点。假设链表 A 的长度为 m、链表 B 的长度为 n,他们的相交序列有 k 个,则相交情况可以如下如所示:
52+
### 思路 1:双指针
53+
54+
如果两个链表相交,那么从相交位置开始,到结束,必有一段等长且相同的节点。假设链表 `listA` 的长度为 $m$、链表 `listB` 的长度为 $n,ドル他们的相交序列有 $k$ 个,则相交情况可以如下如所示:
2155

22-
![](http://qncdn.bujige.net/images/20210401113538.png)
56+
![](https://qcdn.itcharge.cn/images/20210401113538.png)
2357

24-
现在问题是如何找到 m-k 或者 n-k 的位置。
58+
现在问题是如何找到 $m - k$ 或者 $n - k$ 的位置。
2559

26-
考虑将链表 A 的末尾拼接上链表 B,链表 B 的末尾拼接上链表 A
60+
考虑将链表 `listA` 的末尾拼接上链表 `listB`,链表 `listB` 的末尾拼接上链表 `listA`
2761

28-
然后使用两个指针 pA 、PB,分别从链表 A、链表 B 的头节点开始遍历,如果走到共同的节点,则返回该节点。
62+
然后使用两个指针 `pA``pB`,分别从链表 `listA`、链表 `listB` 的头节点开始遍历,如果走到共同的节点,则返回该节点。
2963

30-
否则走到两个链表末尾,返回 None。
64+
否则走到两个链表末尾,返回 `None`
3165

32-
![image-20210401114058127](http://qncdn.bujige.net/images/20210401114100.png)
66+
![](https://qcdn.itcharge.cn/images/20210401114100.png)
3367

34-
##代码
68+
### 思路 1:代码
3569

3670
```Python
3771
class Solution:
@@ -40,9 +74,14 @@ class Solution:
4074
return None
4175
pA = headA
4276
pB = headB
43-
while pA != pB:
77+
while pA != pB:
4478
pA = pA.next if pA != None else headB
4579
pB = pB.next if pB != None else headA
4680
return pA
4781
```
4882

83+
### 思路 1:复杂度分析
84+
85+
- **时间复杂度**:$O(m + n)$。
86+
- **空间复杂度**:$O(1)$。
87+

‎Solutions/剑指 Offer 52. 两个链表的第一个公共节点.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515

1616
如果两个链表相交,那么从相交位置开始,到结束,必有一段等长且相同的节点。假设链表 A 的长度为 m、链表 B 的长度为 n,他们的相交序列有 k 个,则相交情况可以如下如所示:
1717

18-
![](http://qncdn.bujige.net/images/20210401113538.png)
18+
![](https://qcdn.itcharge.cn/images/20210401113538.png)
1919

2020
现在问题是如何找到 m-k 或者 n-k 的位置。
2121

@@ -25,7 +25,7 @@
2525

2626
否则走到两个链表末尾,返回 None。
2727

28-
![image-20210401114058127](http://qncdn.bujige.net/images/20210401114100.png)
28+
![](https://qcdn.itcharge.cn/images/20210401114100.png)
2929

3030
## 代码
3131

‎Solutions/剑指 Offer II 023. 两个链表的第一个重合节点.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919

2020
如果两个链表相交,那么从相交位置开始,到结束,必有一段等长且相同的节点。假设链表 A 的长度为 m、链表 B 的长度为 n,他们的相交序列有 k 个,则相交情况可以如下如所示:
2121

22-
![](http://qncdn.bujige.net/images/20210401113538.png)
22+
![](https://qcdn.itcharge.cn/images/20210401113538.png)
2323

2424
现在问题是如何找到 m-k 或者 n-k 的位置。
2525

@@ -29,7 +29,7 @@
2929

3030
否则走到两个链表末尾,返回 None。
3131

32-
![image-20210401114058127](http://qncdn.bujige.net/images/20210401114100.png)
32+
![](https://qcdn.itcharge.cn/images/20210401114100.png)
3333

3434
## 代码
3535

‎Solutions/面试题 02.07. 链表相交.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121

2222
如果两个链表相交,那么从相交位置开始,到结束,必有一段等长且相同的节点。假设链表 `A` 的长度为 `m`、链表 `B` 的长度为 `n`,他们的相交序列有 `k` 个,则相交情况可以如下如所示:
2323

24-
![](http://qncdn.bujige.net/images/20210401113538.png)
24+
![](https://qcdn.itcharge.cn/images/20210401113538.png)
2525

2626
现在问题是如何找到 `m - k` 或者 `n - k` 的位置。
2727

@@ -31,7 +31,7 @@
3131

3232
否则走到两个链表末尾,返回 `None`
3333

34-
![image-20210401114058127](http://qncdn.bujige.net/images/20210401114100.png)
34+
![](https://qcdn.itcharge.cn/images/20210401114100.png)
3535

3636
## 代码
3737

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /