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 ...
随机推荐
- SpringCloud系列八:自定义Ribbon配置
1. 回顾 上文使用Ribbon实现了客户端侧的负载均衡.但是很多场景下,我们可能需要自定义Ribbon的配置,比如修改Ribbon的负载均衡规则. Spring Cloud允许使用Java代码或属性 ...
- git服务器gitlab之搭建和使用
git服务器比较有名的是gitosis和gitolite,这两个管理和使用起来稍微有些复杂,没有web页面,而gitlab则是类似于github的一个工具,github无法免费建立私有仓库,并且为了代 ...
- WCF 动态调用(1)
很多时候,服务地址都不止一个的,这个时候就要动态去配置地址.配置Web.config,很麻烦 下面就看看怎样实现动态调用WCF. using System; using System.Collecti ...
- Spring+SpringMVC+MyBatis+Maven框架整合
本文记录了Spring+SpringMVC+MyBatis+Maven框架整合的记录,主要记录以下几点 一.Maven需要引入的jar包 二.Spring与SpringMVC的配置分离 三.Sprin ...
- javaweb+mysql+c3p0ajax实现三级联动
1.首先要导入jar文件: c3p0-0.9.5.1.jarcommons-beanutils-1.7.0.jarcommons-collections-3.2.jarcommons-dbutils- ...
- mac下安装phpstorm主题
在<推荐一个phpstorm主题和字体>中介绍了window下如何安装phpstorm主题,这里我们在介绍一下如何在MAC下安装phpstorm主题. 安装方法和window类似,只是需要 ...
- 基于HTML5 audio元素播放声音jQuery小插件
by zhangxinxu from http://www.zhangxinxu.com本文地址:http://www.zhangxinxu.com/wordpress/?p=1609 一.前面的些唠 ...
- TP id 对字符串的查找
// 还剩的图片的id $oldPid = implode(',', $_POST['OldGoodsPic']); // 从数据库中找需要出删除了的 FIND_IN_SET(id,'$oldPid' ...
- Spring MVC列表多选框
以下示例显示如何在使用Spring Web MVC框架的表单中使用列表框(Listbox).首先使用Eclipse IDE来创建一个WEB工程,实现一个让用户可选择自己所善长的技术(多选)的功能.并按 ...
- linux shell习题训练
shell习题训练 求2个数之和 计算1-100的和 将一目录下所有的文件的扩展名改为bak 编译当前目录下的所有.c文件: 打印root可以使用可执行文件数,处理结果: root's bins: 2 ...