[路飞]_js算法:leetcode 148. 排序链表

134 阅读1分钟

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
}