难度:中等
题目描述:
在 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=nulllet left = mergeSort(node)let right = mergeSort(curNode)return merge(left,right)}function merge(left,right){let startNode = new ListNode(0)let pre=startNodelet leftNode=left;let rightNode=rightwhile(leftNode&&rightNode){if(leftNode.val<=rightNode.val){pre.next=leftNodeleftNode=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)};
