Middle-题目97:148. Sort List

来源:互联网 发布:java根据ip获取mac 编辑:程序博客网 时间:2024/06/05 08:02

题目原文:
Sort a linked list in O(n log n) time using constant space complexity.
题目大意:
对一个单链表排序,要求时间复杂度O(nlogn),空间复杂度O(1)
题目分析:
参考discuss中的算法,使用快排,取pivot为第一个节点值。
源码:(language:java)

public class Solution {    public ListNode sortList(ListNode h){        if(h == null || h.next == null)            return h;        /*split into three list*/        ListNode fakesmall = new ListNode(0), small = fakesmall;        ListNode fakelarge = new ListNode(0), large = fakelarge;        ListNode fakeequal = new ListNode(0), equal = fakeequal;        ListNode cur = h; // pivot is h.        while(cur != null){            if(cur.val < h.val){                small.next = cur;                small = small.next;            }            else if(cur.val == h.val){                equal.next = cur;                equal = equal.next;            }            else{                large.next = cur;                large = large.next;            }            cur = cur.next;        }        // put an end.        small.next = equal.next = large.next = null;        // merge them and return . merge reusing below one. merge for quicksort should be simplified.         return merge(merge(sortList(fakesmall.next), sortList(fakelarge.next)),fakeequal.next) ;    }    private ListNode merge(ListNode h, ListNode m){        ListNode fake = new ListNode(0), cur = fake;        while(h != null && m != null){            if(h.val < m.val){                cur.next = h;                h = h.next;            }            else{                cur.next = m;                m = m.next;            }            cur = cur.next;        }        cur.next = (h == null ? m : h);        return fake.next;    }}

成绩:
8ms,beats 42.09%,众数8ms,31.36%
cmershen的碎碎念:
数组的快排中pivot是使用三者取中法,而链表不是随机存取的,使用三者取中法要遍历一次链表,反而不能加速。

0 0
原创粉丝点击