【链表】Sort List(归并排序)

题目:

Sort a linked list in O(n log n) time using constant space complexity.

思路:

nlogn的排序有快速排序、归并排序、堆排序。双向链表用快排比较适合,堆排序也可以用于链表,单向链表适合用归并排序。

/**
 * 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;
    }else{
        var slow=head,fast=head;
        while(fast.next!=null&&fast.next.next!=null){
            slow=slow.next;
            fast=fast.next.next;
        }
        //拆成两个链表
        fast=slow;
        slow=slow.next;
        fast.next=null;
        
        fast=sortList(head);
        slow=sortList(slow);
        return merge(fast,slow);
    }
};

function merge(head1,head2){
    if(head1==null){
        return head2;
    }
    if(head2==null){
        return head1;
    }
    var res=new ListNode(),p=new ListNode();
    if(head1.val<head2.val){
        res=head1;
        head1=head1.next;
    }else{
        res=head2;
        head2=head2.next;
    }
    p=res;
    
    while(head1!=null&&head2!=null){
        if(head1.val<head2.val){
            p.next=head1;
            head1=head1.next;
        }else{
            p.next=head2;
            head2=head2.next;
        }
        p=p.next;
    }
    
    if(head1!=null){
        p.next=head1;
    }else if(head2!=null){
        p.next=head2;
    }
    
    return res;
}
posted @ 2016-01-19 16:53  很好玩  阅读(942)  评论(0编辑  收藏  举报