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

法I:快排。快排的难点在于切分序列。从头扫描,碰到>=target的元素,停止;从第二个字串扫描,碰到<=target的元素停止;交换这两个元素。这样的好处是:当数据元素都相同时,也能控制在logn次递归(否则需要O(n))。另外,要注意避免子序列只剩两个相等元素时的死循环。

/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* sortList(ListNode* head) {
if(head == NULL || head->next==NULL) return head; //only one element ListNode* dummyHead1 = new ListNode();
ListNode* dummyHead2 = new ListNode();
ListNode* fastNode = dummyHead1;
ListNode* slowNode = dummyHead1;
ListNode* cur1, *cur2;
int tmp;
dummyHead1->next = head; //fast, slow pointer to find the middle point
while(fastNode->next){
fastNode = fastNode->next;
if(fastNode->next) fastNode = fastNode->next;
else break;
slowNode = slowNode->next; //slowNode always point to the element before center(odd number)
// or the left center (even number)
} //partition the sequence into two halves
dummyHead2->next = slowNode->next;
slowNode->next=NULL;
cur1 = dummyHead1;
cur2 = dummyHead2->next;
while(cur1->next&&cur2->next){
//stop when find an element in first half, value of whihch >= target
while(cur1->next && cur1->next->val < dummyHead2->next->val) cur1 = cur1->next;
//stop when find an element in second half, value of which <= target
while(cur2->next && cur2->next->val > dummyHead2->next->val) cur2 = cur2->next;
if(!cur1->next || !cur2->next ) break;
tmp = cur1->next->val;
cur1->next->val = cur2->next->val;
cur2->next->val = tmp;
cur1 = cur1->next;
cur2 = cur2->next; }
while(cur1->next){
//stop when find an element in first half, value of which > target
//>= may lead to endless recursion if two equal elements left
while(cur1->next && cur1->next->val <= dummyHead2->next->val) cur1 = cur1->next;
if(!cur1->next) break;
cur2->next = cur1->next;
cur1->next = cur1->next->next;
cur2 = cur2->next;
cur2->next = NULL;
}
while(cur2->next){
//stop when find an element in second half, value of which < target
//<= may lead to endless recursion if two equal elements left
while(cur2->next && cur2->next->val >= dummyHead2->next->val) cur2 = cur2->next;
if(!cur2->next) break;
cur1->next = cur2->next;
cur2->next = cur2->next->next;
cur1 = cur1->next;
cur1->next = NULL;
} //cascade two halves
head = sortList(dummyHead1->next);
cur2 = sortList(dummyHead2->next);
if(head==NULL) return cur2;
cur1 = head;
while(cur1->next){
cur1 = cur1->next;
}
cur1->next = cur2;
return head;
} };

法II: 归并排序。由于是List,归并排序的好处是不用额外申请O(n)的空间

/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* sortList(ListNode* head) {
if(head == NULL || head->next==NULL) return head; //only one element ListNode* dummyHead1 = new ListNode();
ListNode* dummyHead2 = new ListNode();
ListNode* fastNode = dummyHead1;
ListNode* slowNode = dummyHead1;
ListNode* cur1, *cur2, *cur;
dummyHead1->next = head; //fast, slow pointer to find the middle point
while(fastNode->next){
fastNode = fastNode->next;
if(fastNode->next) fastNode = fastNode->next;
else break;
slowNode = slowNode->next; //slowNode always point to the element before center(odd number)
// or the left center (even number)
}
dummyHead2->next = slowNode->next;
slowNode->next = NULL; //recursion
cur1 = sortList(dummyHead1->next);
cur2 = sortList(dummyHead2->next); //merge
cur = dummyHead1;
while(cur1 && cur2){
if(cur1->val <= cur2->val){
cur->next = cur1;
cur1 = cur1->next;
}
else{
cur->next = cur2;
cur2 = cur2->next;
}
cur = cur->next;
}
if(cur1){
cur->next = cur1;
}
else{
cur->next = cur2;
}
return dummyHead1->next;
} };

148. Sort List (List)的更多相关文章

  1. C#版 - LeetCode 148. Sort List 解题报告(归并排序小结)

    leetcode 148. Sort List 提交网址: https://leetcode.com/problems/sort-list/  Total Accepted: 68702 Total ...

  2. 148. Sort List - LeetCode

    Solution 148. Sort List Question 题目大意:对链表进行排序 思路:链表转为数组,数组用二分法排序 Java实现: public ListNode sortList(Li ...

  3. [LeetCode] 148. Sort List 链表排序

    Sort a linked list in O(n log n) time using constant space complexity. Example 1: Input: 4->2-> ...

  4. Java for LeetCode 148 Sort List

    Sort a linked list in O(n log n) time using constant space complexity. 解题思路: 归并排序.快速排序.堆排序都是O(n log ...

  5. 148. Sort List -- 时间复杂度O(n log n)

    Sort a linked list in O(n log n) time using constant space complexity. 归并排序 struct ListNode { int va ...

  6. 148. Sort List

    Sort a linked list in O(n log n) time using constant space complexity. 代码如下: /** * Definition for si ...

  7. leetcode 148. Sort List ----- java

    Sort a linked list in O(n log n) time using constant space complexity. 排序,要求是O(nlog(n))的时间复杂度和常数的空间复 ...

  8. [LeetCode] 148. Sort List 解题思路

    Sort a linked list in O(n log n) time using constant space complexity. 问题:对一个单列表排序,要求时间复杂度为 O(n*logn ...

  9. 【leetcode】148. Sort List

    Sort a linked list in O(n log n) time using constant space complexity. 链表排序可以用很多方法,插入,冒泡,选择都可以,也容易实现 ...

  10. 148. Sort List (java 给单链表排序)

    题目:Sort a linked list in O(n log n) time using constant space complexity. 分析:给单链表排序,要求时间复杂度是O(nlogn) ...

随机推荐

  1. elixir mix开发入门

    备注: 简单使用mix 进行项目的生成,同时添加docker 构建支持 1. 生成项目 mix new mydemoproject 输出信息如下: * creating README.md * cre ...

  2. 多文件的Makefile

    Linux下编写一般采用gcc编译工具,但gcc无法满足大量的文件同时编译,这是就用到Makefile,首先先介绍一下gcc GCC编译的四个步骤 1.预处理,生成预编译文件(.文件): Gcc –E ...

  3. spring整合xfire出现Document root element "beans", must match DOCTYPE root "null"错误解决方案

    fire自带的包下有个spring1.2.6的jar包,而工程的jar包是2.0的. 解决方案: 1.将原配置文件的头schema方式换为DOCTYPE方式,原配置文件如下(非maven) <? ...

  4. 基于Oracle的EntityFramework的WEBAPI2的实现(一)——准备工作

    目前在.net的范围内,好的而且方便的ORM的真的不是很多,与VS集成方便的也就当属EntityFramework(以下简称EF,不知道为什么,总EF这个缩写好不专业).但是,好多公司使用的又是ORA ...

  5. opencv读取中文路径报错的问题

    ) ## 经验证,不需要再转bgr,myImread的读图结果已经是和imread一样的 return img

  6. 窗口点击模拟a

    [问题描述] 在计算机屏幕上,有N 个窗口.窗口的边界上的点也属于该窗口.窗口之间有层次的区别,在多于一个窗口重叠的区域里,只会显示位于顶层的窗口里的内容.当你用鼠标点击屏幕上一个点的时候,若其在窗口 ...

  7. 全排列函数C++实现

    例题:求由123456789构成的所有九位数字 1 用C++的next_permutation函数 #include <iostream> #include <stdio.h> ...

  8. 适配:px与dp转换

    public class DensityUtil { /** * 根据手机的分辨率从 dp 的单位 转成为 px(像素) */ public static int dip2px(Context con ...

  9. 【转】Jmeter入门:如何建立和使用Jmeter测试环境

    一.工具描述 apache jmeter是100%的java桌面应用程序,它被设计用来加载被测试软件功能特性.度量被测试软件的性能.设计jmeter的初衷是测试web应用, 后来又扩充了其它的功能.j ...

  10. 杂项:大数据 (巨量数据集合(IT行业术语))

    ylbtech-杂项:大数据 (巨量数据集合(IT行业术语)) 大数据(big data),指无法在一定时间范围内用常规软件工具进行捕捉.管理和处理的数据集合,是需要新处理模式才能具有更强的决策力.洞 ...