难度:中等
题目描述:
在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。
示例:
输入: -1->5->3->4->0
输出: -1->0->3->4->5
解题思路:
- 1、把长度为n的输入序列分成两个长度为n/2的子序列
- 2、对这两个子序列分别采用归并排序
- 3、将两个排序好的子序列合并成一个最终的排序序列
var sortList = function(head) {
function mergeSort(node){
if(!node||!node.next){
return node;
}
let slowNode=node;
let fastNode=node;
// 找到中点
while(fastNode.next&&fastNode.next.next){
slowNode=slowNode.next;
fastNode=fastNode.next.next
}
let curNode=slowNode.next;
slowNode.next=null
let left = mergeSort(node)
let right = mergeSort(curNode)
return merge(left,right)
}
function merge(left,right){
let startNode = new ListNode(0)
let pre=startNode
let leftNode=left;
let rightNode=right
while(leftNode&&rightNode){
if(leftNode.val<=rightNode.val){
pre.next=leftNode
leftNode=leftNode.next
}else{
pre.next=rightNode;
rightNode=rightNode.next
}
pre=pre.next
}
if(leftNode){
pre.next=leftNode
}
if(rightNode){
pre.next=rightNode
}
return startNode.next
}
return mergeSort(head)
};