🔄Update: 排序链表
This commit is contained in:
+104
@@ -0,0 +1,104 @@
|
|||||||
|
# 排序链表
|
||||||
|
|
||||||
|
## 题目
|
||||||
|
|
||||||
|
给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
示例 1:
|
||||||
|
|
||||||
|
|
||||||
|
输入:head = [4,2,1,3]
|
||||||
|
输出:[1,2,3,4]
|
||||||
|
示例 2:
|
||||||
|
|
||||||
|
|
||||||
|
输入:head = [-1,5,3,4,0]
|
||||||
|
输出:[-1,0,3,4,5]
|
||||||
|
示例 3:
|
||||||
|
|
||||||
|
输入:head = []
|
||||||
|
输出:[]
|
||||||
|
|
||||||
|
|
||||||
|
提示:
|
||||||
|
|
||||||
|
链表中节点的数目在范围 [0, 5 * 104] 内
|
||||||
|
-105 <= Node.val <= 105
|
||||||
|
|
||||||
|
|
||||||
|
进阶:你可以在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序吗?
|
||||||
|
|
||||||
|
## 思路
|
||||||
|
|
||||||
|
- 归并排序
|
||||||
|
- 拆分
|
||||||
|
- 快慢指针
|
||||||
|
- 合并
|
||||||
|
|
||||||
|
|
||||||
|
## 代码
|
||||||
|
|
||||||
|
```java
|
||||||
|
/**
|
||||||
|
* Definition for singly-linked list.
|
||||||
|
* public class ListNode {
|
||||||
|
* int val;
|
||||||
|
* ListNode next;
|
||||||
|
* ListNode() {}
|
||||||
|
* ListNode(int val) { this.val = val; }
|
||||||
|
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
|
||||||
|
* }
|
||||||
|
*/
|
||||||
|
class Solution {
|
||||||
|
public ListNode sortList(ListNode head) {
|
||||||
|
// -- Divide -> Sort -> Merge --
|
||||||
|
// Special
|
||||||
|
if (head == null || head.next == null) {
|
||||||
|
return head;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Init: slow, fast, dummyHead
|
||||||
|
ListNode dummyHead = new ListNode(-1);
|
||||||
|
dummyHead.next = head;
|
||||||
|
ListNode slow = dummyHead;
|
||||||
|
ListNode fast = dummyHead;
|
||||||
|
while (fast.next != null && fast.next.next != null) {
|
||||||
|
fast = fast.next.next;
|
||||||
|
slow = slow.next;
|
||||||
|
}
|
||||||
|
// Divide: [headA .... tailA(slow)] [headB(slow.next) ... tailB]
|
||||||
|
ListNode headA = head;
|
||||||
|
ListNode headB = slow.next;
|
||||||
|
slow.next = null;
|
||||||
|
// Sort
|
||||||
|
headA = sortList(headA);
|
||||||
|
headB = sortList(headB);
|
||||||
|
// Merge
|
||||||
|
return mergeList(headA, headB);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ListNode mergeList(ListNode headA, ListNode headB) {
|
||||||
|
// Init: dummyHead, tail
|
||||||
|
ListNode dummyHead = new ListNode(-1);
|
||||||
|
ListNode tail = dummyHead;
|
||||||
|
// Traverse: Merge
|
||||||
|
while (headA != null && headB != null) {
|
||||||
|
int valA = headA.val;
|
||||||
|
int valB = headB.val;
|
||||||
|
if (valA < valB) {
|
||||||
|
tail.next = headA;
|
||||||
|
headA = headA.next;
|
||||||
|
} else {
|
||||||
|
tail.next = headB;
|
||||||
|
headB = headB.next;
|
||||||
|
}
|
||||||
|
tail = tail.next;
|
||||||
|
}
|
||||||
|
// Operation: After
|
||||||
|
tail.next = headA == null ? headB : headA;
|
||||||
|
return dummyHead.next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
Reference in New Issue
Block a user