题目描述:
在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。
示例 1:
输入: 4->2->1->3
输出: 1->2->3->4
示例 2:
输入: -1->5->3->4->0
输出: -1->0->3->4->5
算法实现:
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} head
* @return {ListNode}
*/
var sortList = function(head) {
if (head === null || head.next === null)
return head
let slow = head,
fast = head
while (slow.next && fast.next && fast.next.next) {
slow = slow.next
fast = fast.next.next
}
let mid = slow.next
slow.next = null
let right = mid
let left = head
return merge(sortList(left), sortList(right))
};
let merge = function(left, right) {
let res = new ListNode(null)
let p1 = left,
p2 = right
let p = res
while (p1 && p2) {
if (p1.val < p2.val) {
let s = p1
p1 = p1.next
s.next = null
p.next = s
p = s
} else {
let s = p2
p2 = p2.next
s.next = null
p.next = s
p = s
}
}
if (p1)
p.next = p1
if (p2)
p.next = p2
return res.next
}
思考:
看起来很简单实操却很难的一道题,由于控制了时间复杂度和空间复杂度,导致只能用归并排序的方法,以前并没有使用过这种方法,大致的思路是由底向上逐渐排序归并最后形成正确的链表。
总结:
很好的一道题,值得思考。