LeetCode::Sort List 具体分析
Sort a linked list in O(n log n)
 time using constant space complexity.
这道题目非常简短的一句话。给链表排序,看到nlogn。我们能够来简单复习一下排序。
首先说一下这个nlogn的时间复杂度(依据决策树我们能够得出这个界限)。是基于比較排序的最小上限,也就是说。对于没有一定范围情况的数据来说。最快的排序思路就是归并和高速排序了(当然详细的參数系数还是由更详细的设置决定的)。对于数组的话,假设使用归并排序,不是in place的,由于我们须要额外申请一个(N)空间用于merge的时候使用,所以导致了数据的复制和传递,因此不适合作为主存排序。(内存的数据变化量但是惊人的呀)。
但是,对于链表的归并排序,就能够做到in
 place,原因在于。链表本来就是一个动态的数据结构,我们在merge的时候改变一下指针的指向就OK了。之前,我在帮公司写一个项目的时候,support组提供的数据结构接口不是非常惬意,我就自己封装了一个利用归并来排序的链表,感觉用起来还行(强迫症?)。顺便提一下,最主要的排序。插入排序。n^2的时间复杂度;以及历史上第一次突破平方界限的排序。希尔排序,事实上就是插入排序的改良版。时间复杂度取决于因子的选取(详细我忘记了),废话太多了>.< orz。
以下是代码,当中一些个人认为重要的地方也做了凝视。
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode *findMedian(ListNode *head){
            ListNode *slow = head;
            ListNode *fast = head;
            while(fast->next != NULL && fast->next->next != NULL){   //这里注意先后顺序,必须先保证slow->next = NULL
                slow = slow->next;
                fast = fast->next->next;
            }
            return slow;
    }
    ListNode *merge(ListNode *a, ListNode *b){
        ListNode *dummyNode = new ListNode(0);         //在头节点不确定或者须要删除时。引入哑节点是非常好的选择
        ListNode *pos = dummyNode;
        while(a != NULL && b != NULL){
            if (a->val <= b->val){
                pos->next = a;
                a = a->next;
            }
            else{
                pos->next = b;
                b = b->next;
            }
            pos = pos->next;
        }
        pos->next = a != NULL ? a : b;     //这里用问号表达式能够降低代码量
        return dummyNode->next;
    }
    ListNode *sortList(ListNode *head) {
        if (head == NULL || head->next == NULL)
            return head;
        ListNode *mid = findMedian(head);
        ListNode *next = mid->next;
        mid->next = NULL;    //这里须要注意,一定要断开链表,所以又一次申请了节点指针next而不是直接将mid = mid->next
        return merge(sortList(head), sortList(next));
    }
};LeetCode::Sort List 具体分析的更多相关文章
- LeetCode—-Sort List
		LeetCode--Sort List Question Sort a linked list in O(n log n) time using constant space complexity. ... 
- LeetCode :: Insertion Sort List [具体分析]
		Sort a linked list using insertion sort. 仍然是一个很简洁的题目,让我们用插入排序给链表排序:这里说到插入排序.能够来回想一下, 最主要的入门排序算法.就是插入 ... 
- LeetCode Sort List 链表排序(规定 O(nlogn) )
		Status: AcceptedRuntime: 66 ms 题意:根据给出的单链表,用O(nlogn)的时间复杂度来排序.由时间复杂度想到快排.归并这两种排序.本次用的是归并排序.递归将链表的规模不 ... 
- [LeetCode] Sort Characters By Frequency 根据字符出现频率排序
		Given a string, sort it in decreasing order based on the frequency of characters. Example 1: Input: ... 
- [LeetCode] Sort List 链表排序
		Sort a linked list in O(n log n) time using constant space complexity. 常见排序方法有很多,插入排序,选择排序,堆排序,快速排序, ... 
- [LeetCode] Sort Colors 颜色排序
		Given an array with n objects colored red, white or blue, sort them so that objects of the same colo ... 
- leetcode sort List
		Sort a linked list in O(n log n) time using constant space complexity. /** * Definition for singly-l ... 
- leetcode:Sort List(一个链表的归并排序)
		Sort a linked list in O(n log n) time using constant space complexity. 分析:题目要求时间复杂度为O(nlogn),所以不能用qu ... 
- FCL源码中数组类型的学习及排序函数Sort函数的分析
		Array 是所有数组的基类ArrayList 解决了所有Array 类的缺点 能动态扩容, 但是类型不安全的,而是会有装箱与拆箱的性能开销List<T> 则是解决了ArrayLis ... 
随机推荐
- 写入文件,创建xunlei批量任务
			[php] <?php $arr = array(); $arr[] = 'http://s1.dwstatic.com/group1/M00/83/4A/834a040953745f52e8a ... 
- webpack 环境搭建基础框架
			一.安装babel相关 1,安装依赖 cnpm i -D babel-core babel-loader babel-preset-env babel-preset-stage- babel-plug ... 
- PHP获取QQ群成员QQ号码
			.加入某个群 .进入群空间http://qun.qzone.qq.com/group#!/25998059/member 备注:25998059为群号码 .进入群成员列表 .使用浏览,在某个群成员头像 ... 
- 李洪强iOS开发之OC[007] - 李洪强iOS开发之类的声明和实现
			类的声明和实现 类是一类具有相同特征和共同行为的集合 小轿车 大卡车 挖掘机 (车) 车类 类名: Car 属性: 颜色 速度 轮字数 共同行为: 跑 停 载人 对象: 是类的具 ... 
- FreeBSD安装MySQL5.7.17
			[root@tuhooo /usr/ports/databases/mysql57-server]# make install===> Installing for mysql57-serve ... 
- Win2k8&&vCenter部署全流程
			几个不同的组件 vCenter Server:对ESXi主机进行集中管理的服务器端软件,安装在windows server 2008R2或以上的操作系统里,通过SQL 2008R2 或以上版本的数据库 ... 
- c#文件路径的获取
			string fullPath = @"\WebSite1\Default.aspx"; string filename = System.IO.Path.GetFileName( ... 
- hdu 2460(tarjan求边双连通分量+LCA)
			题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2460 思路:题目的意思是要求在原图中加边后桥的数量,首先我们可以通过Tarjan求边双连通分量,对于边 ... 
- C++资源文件初使用[C++菜鸟]
			起因 项目中需要可能变动的一些映射关系,而且是封装成独立的库——一个dll文件. 思路:把excel文件导出成.csv文件,当作资源加载到项目里,读取后拿到全部的字符,再分割处理. 添加资源 VS20 ... 
- go生成xml
			package main import ( "encoding/xml" "fmt" // "os" ) type Servers stru ... 
