Skip to content

Commit 48dceed

Browse files
zhouboyi1998zhouboyi
authored andcommitted
docs(note): 添加题解:148. 排序链表
1 parent a7f0f77 commit 48dceed

File tree

4 files changed

+137
-0
lines changed

4 files changed

+137
-0
lines changed

markdown/hello/0000.Hello.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
| <span style="color: #FF2D55;">**Hard**</span> | [**0124.二叉树中的最大路径和**](../hard/0124.二叉树中的最大路径和.md) |
5050
| <span style="color: #00AF9B;">**Easy**</span> | [**0136.只出现一次的数字**](../easy/0136.只出现一次的数字.md) |
5151
| <span style="color: #00AF9B;">**Easy**</span> | [**0141.环形链表**](../easy/0141.环形链表.md) |
52+
| <span style="color: #FFB822;">**Medium**</span> | [**0148.排序链表**](../medium/0148.排序链表.md) |
5253
| <span style="color: #FF2D55;">**Hard**</span> | [**0164.最大间距**](../hard/0164.最大间距.md) |
5354
| <span style="color: #00AF9B;">**Easy**</span> | [**0169.多数元素**](../easy/0169.多数元素.md) |
5455
| <span style="color: #00AF9B;">**Easy**</span> | [**0171.Excel表列序号**](../easy/0171.Excel表列序号.md) |
Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
<h1 style="text-align: center;"> <span style="color: #FFB822;">148. 排序链表</span> </h1>
2+
3+
### 🚀 LeetCode
4+
5+
<base target="_blank">
6+
7+
<span style="color: #FFB822;">**Medium**</span> [**https://leetcode.cn/problems/sort-list/**](https://leetcode.cn/problems/sort-list/)
8+
9+
---
10+
11+
### ❓ Description
12+
13+
<br/>
14+
15+
给你链表的头结点 `head`,请将其按 **升序** 排列并返回 **排序后的链表**
16+
17+
<br/>
18+
19+
**示例 1:**
20+
21+
<img src="../../public/0148/sort-list-1.jpg" alt="sort-list-1.jpg"/>
22+
23+
```
24+
输入: head = [4, 2, 1, 3]
25+
输出: [1, 2, 3, 4]
26+
```
27+
28+
**示例 2:**
29+
30+
<img src="../../public/0148/sort-list-2.jpg" alt="sort-list-2.jpg"/>
31+
32+
```
33+
输入: head = [-1, 5, 3, 4, 0]
34+
输出: [-1, 0, 3, 4, 5]
35+
```
36+
37+
**示例 3:**
38+
39+
```
40+
输入: head = []
41+
输出: []
42+
```
43+
44+
<br/>
45+
46+
**提示:**
47+
48+
* 链表中节点的数目在范围 `[0, 5 * 10^4]`
49+
* `-10^5 <= Node.val <= 10^5`
50+
51+
<br/>
52+
53+
**进阶:** 你可以在 `O(n log n)` 时间复杂度和常数级空间复杂度下,对链表进行排序吗?
54+
55+
---
56+
57+
### ❗ Solution
58+
59+
<br/>
60+
61+
#### Java
62+
63+
```
64+
/**
65+
* Definition for singly-linked list.
66+
* public class ListNode {
67+
* int val;
68+
* ListNode next;
69+
* ListNode() {}
70+
* ListNode(int val) { this.val = val; }
71+
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
72+
* }
73+
*/
74+
class Solution {
75+
public ListNode sortList(ListNode head) {
76+
return divide(head, null);
77+
}
78+
79+
// 对半拆分
80+
public ListNode divide(ListNode head, ListNode tail) {
81+
// 如果头节点为空或者头节点的下一个节点为空
82+
// 说明当前子链表为空或者只有一个节点, 结束递归, 开始返回
83+
if (head == null || head.next == null) {
84+
return head;
85+
}
86+
87+
// 快慢指针遍历链表, 找到中间节点
88+
ListNode slow = head, fast = head;
89+
90+
// 快指针走两步, 慢指针走一步
91+
// 直到快指针到达链表尾部, 此时慢指针指向的就是中间节点
92+
// 如果当前链表长度为偶数, 慢指针指向的是中间两个节点中, 靠左的那一个节点
93+
while (fast != tail) {
94+
fast = fast.next;
95+
if (fast != tail) {
96+
fast = fast.next;
97+
slow = slow.next;
98+
}
99+
}
100+
101+
// 获取两个中间节点
102+
ListNode mid1 = slow;
103+
ListNode mid2 = slow.next;
104+
// 切断左右子链表的连接
105+
mid1.next = null;
106+
107+
// 递归, 将左右子链表继续左右拆分, 一直拆分到最小单元, 也就是直到子链表为空或者长度为 1
108+
ListNode left = divide(head, mid1);
109+
ListNode right = divide(mid2, tail);
110+
// 合并左右子链表, 并在合并的同时进行排序
111+
return merge(left, right);
112+
}
113+
114+
// 归并排序
115+
public ListNode merge(ListNode left, ListNode right) {
116+
ListNode head = new ListNode(0);
117+
ListNode node = head;
118+
while (left != null && right != null) {
119+
if (left.val <= right.val) {
120+
node.next = left;
121+
left = left.next;
122+
} else {
123+
node.next = right;
124+
right = right.next;
125+
}
126+
node = node.next;
127+
}
128+
if (left != null) {
129+
node.next = left;
130+
} else if (right != null) {
131+
node.next = right;
132+
}
133+
return head.next;
134+
}
135+
}
136+
```

public/0148/sort-list-1.jpg

20.6 KB
Loading

public/0148/sort-list-2.jpg

25.8 KB
Loading

0 commit comments

Comments
 (0)