Sort List

来源:互联网 发布:淘宝新店上架多少宝贝 编辑:程序博客网 时间:2024/06/01 23:36

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

思路:当看到sort list 时 肯定会想到 sort array是怎样做的。sort array 常用的两种方法有 quick sort 和merge sort。

而对于quick sort,每一次都要选择一个对照数字进行partition。当选第一个数字或者最后一个数字的时候,很有可能产生不平衡(例如这个array 本来就是排好序的,容易产生一边倒),即出现最坏情况。解决这种问题的办法便是 每次都取中间的数或者 random 取值。但是无论如何,快速排序是一种不稳定的算法,尽管它的平均时间复杂度是O(nlogn).

所以,对于list, 用merge sort 更好一些。merge sort 是一个严格的nlogn 的方法,可以避免出现最坏情况。还有一点对于sort list 使用merge sort的原因是 space complexity 是o(1). 对于数组而言,space complexity 是o(n). 可以对于list 则是o(1). 所以比较来看,对于linked list:

方法timespace quick sortO(nlogn)         O(logn)         unstablemerge sortO(nlogn)O(1) 如果是数组,空间复杂度为O(N)stable
所以 这道题目用merge sort 解决更好。

用merge sort 解决这道题目主要有以下几个步骤:

findmid:找到要排序链表的中间结点(使用 faster lower node)

partition:将整个链表分为两个子链表

sort:对子链表进行排序

merge:将排号序的链表合并(其实对于任意两个队列,不过数据结构是数组还是链表,基本思路都是如此)

所以 这道题目主要考察的有三点:1快慢指针 2两个有序数列的合并 3recursive

/** * Definition for singly-linked list. * class ListNode { *     int val; *     ListNode next; *     ListNode(int x) { *         val = x; *         next = null; *     } * } */public class Solution {    public ListNode sortList(ListNode head) {        if(head==null||head.next==null){            return head;        }        ListNode mid=findmid(head);        ListNode head2=sortList(mid.next);        mid.next=null;//be careful of this statement, if it is omited, it will go wrong.        ListNode head1=sortList(head);        return merge(head1,head2);    }        private ListNode findmid(ListNode head){        ListNode faster = head;        ListNode slower = head;        while(faster.next!=null&&faster.next.next!=null){            slower=slower.next;            faster=faster.next.next;        }        return slower;    }        private ListNode merge(ListNode head1,ListNode head2){        ListNode dummy=new ListNode(0);        ListNode tail=dummy;        while(head1!=null&&head2!=null){            if(head1.val<=head2.val){                tail.next=head1;                head1=head1.next;            }else{                tail.next=head2;                head2=head2.next;            }            tail=tail.next;        }        if(head1!=null){            tail.next=head1;        }else{            tail.next=head2;        }        return dummy.next;    }            }


           

    

0 0
原创粉丝点击