leetcode 148. 排序链表
给你链表的头结点 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 = []
输出: []
思路: 快速排序
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} head
* @return {ListNode}
*/
var sortList = function(head) {
let n=0,p=head;
while(p){p=p.next;n++}
return getSortHead(head,n)
};
function getSortHead(head,n){
if(head==null||head.next==null)return head;
let l=Math.floor(n/2);
let lp=head;
let rp=lp;
let p=null;
for(let i=1;i<l;i++,rp=rp.next);
p=rp;
rp=rp.next;
p.next=null;
lp=getSortHead(lp,l);
rp=getSortHead(rp,n-l);
let ret=new ListNode(null);p=ret;
while(lp||rp){
if((rp==null)||(lp&&lp.val<=rp.val)){
p.next=lp;
lp=lp.next;
p=p.next;
}else{
p.next=rp;
rp=rp.next;
p=p.next;
}
}
return ret.next
}