148.排序链表
这道题是leecode hot100的第148题
难度: 中等
题目: 给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。
思路分析:
-
找中点:用快慢指针,快指针走两步、慢指针走一步,快指针到末尾时,慢指针正好在中点。
-
拆分递归:把链表从中间断开,分别递归排序左右两段。
-
合并有序链表:把两个排好序的小链表,合并成一个大的有序链表
题解语言: js
题解
var sortList = function(head) {
if (!head || !head.next) return head;
// 1. 快慢指针找链表中点
let slow = head;
let fast = head;
while (fast.next && fast.next.next) {
slow = slow.next;
fast = fast.next.next;
}
let mid = slow.next;
slow.next = null;
// 2. 递归拆分左右两部分
let left = sortList(head);
let right = sortList(mid);
// 3. 合并两个有序链表
const dummy = new ListNode(0);
let p = dummy;
while (left && right) {
if (left.val < right.val) {
p.next = left;
left = left.next;
} else {
p.next = right;
right = right.next;
}
p = p.next;
}
// 拼接剩余部分
p.next = left ? left : right;
return dummy.next;
};