Middle-题目97:148. Sort List

原创 2016年05月31日 19:51:22

题目原文:
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是使用三者取中法,而链表不是随机存取的,使用三者取中法要遍历一次链表,反而不能加速。

版权声明:完整版Leetcode题解请出门左转https://github.com/cmershen1/leetcode/tree/master/docs

相关文章推荐

148. Sort List

Sort ListSort a linked list in O(n log n) time using constant space complexity.对一个链表排序,要求O(n log n)的...

LeetCode之148_Sort List

LeetCode之Sort List 时间复杂度为O(n log n),空间复杂度为常量的单链表排序算法

leetcode148 Sort List

leetcode148 Sort List 题目内容 算法分析相对于时间复杂度为O(nlogn)的排序算法,有快速排序和归并排序。这里采用的是归并排序。思路大致如下: 归并排序的大致思想就是,将链表...

LeetCode 148. Sort List--O(nlogn)时间复杂度和常数空间复杂度给链表排序

Sort a linked list in O(n log n) time using constant space complexity. package com.main; class Lis...

148. Sort List (python)

Sort a linked list in O(n log n) time using constant space complexity. 思路:能够有O(n lgn)时间复杂度的算法为,快速排序...

Leetcode148:Sort List

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

Sort List - LeetCode 148

题目描述 : Sort a linked list in O(n log n) time using constant space complexity. Hide Tags Linked Lis...

148. Sort List\191. Number of 1 Bits\476. Number Complement\342. Power of Four

题目描述 代码实现题目描述Sort a linked list in O(n log n) time using constant space complexity.对一个链表进行排序,时间复杂度为O...

leetcode-Sort List-148

用NlgN的时间对链表进行排序,对空间没有要求。 这个复杂度有归并排序和快排,但是快排要求从两头扫描,链表做不到 归并排序: 两个两个一组排,之后再四个四个一组排,最后是两个有序表合并,递归 /** ...

【Leet Code】148. Sort List---Medium

Sort a linkedlist in O(n log n) time using constant space complexity. 思路: 借助2-路归并排序实现。 基本思想: 归并排序(M...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)