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

C++代码的实现:

#include<iostream>
#include<new>
using namespace std; //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)
return NULL;
//递归的结束条件,注意,与对数组的归并排序不同
if(head->next==NULL)
return head;
ListNode *p=head;
    //q不能从head开始,为什么呢?
ListNode *q=head->next;
ListNode *l2=NULL;
while(q&&q->next)
{
p=p->next;
q=q->next->next;
}
l2=p->next;
p->next=NULL;
return Merge(sortList(head),sortList(l2));
}
ListNode *Merge(ListNode *l1,ListNode *l2)
{
ListNode *pre=l1;
ListNode *p=l1;
ListNode *q=l2;
while(p&&q)
{
if(p->val<=q->val)
{
pre=p;
p=p->next;
continue;
}
else
{
l2=q->next;
q->next=NULL;
q->next=p;
if(p==l1)
l1=q;
else
pre->next=q;
pre=q;
q=l2;
}
}
if(q)
pre->next=q;
return l1;
}
void createList(ListNode *&head)
{
ListNode *p=NULL;
int i=;
int arr[]= {,,,,,,,,,};
for(i=; i<; i++)
{
if(head==NULL)
{
head=new ListNode(arr[i]);
if(head==NULL)
return;
}
else
{
p=new ListNode(arr[i]);
p->next=head;
head=p;
}
}
}
}; int main()
{
Solution s;
ListNode *L=NULL;
s.createList(L);
ListNode *L1=NULL;
L1=s.sortList(L);
while(L1)
{
cout<<L1->val<<" ";
L1=L1->next;
}
}

运行结果:

参考:http://www.tuicool.com/articles/2eemi2

http://www.cnblogs.com/tenosdoit/p/3666585.html

Sort List (使用归并排序的链表排序)的更多相关文章

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

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

  2. insertion sort list (使用插入排序给链表排序)

    Sort a linked list using insertion sort. 对于数组的插入排序,可以参看排序算法入门之插入排序(java实现),遍历每个元素,然后相当于把每个元素插入到前面已经排 ...

  3. [LeetCode] Sort List 链表排序

    Sort a linked list in O(n log n) time using constant space complexity. 常见排序方法有很多,插入排序,选择排序,堆排序,快速排序, ...

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

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

  5. 给乱序的链表排序 · Sort List, 链表重排reorder list LoLn...

    链表排序 · Sort List [抄题]: [思维问题]: [一句话思路]: [输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入): [画图]: quick ...

  6. Leetcode:148_Sort List | O(nlogn)链表排序 | Medium

    题目:Sort List Sort a linked list in O(n log n) time using constant space complexity 看题目有两个要求:1)时间复杂度为 ...

  7. C语言 链表的使用(链表的增删查改,链表逆转,链表排序)

    //链表的使用 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include< ...

  8. 八大排序方法汇总(选择排序,插入排序-简单插入排序、shell排序,交换排序-冒泡排序、快速排序、堆排序,归并排序,计数排序)

    2013-08-22 14:55:33 八大排序方法汇总(选择排序-简单选择排序.堆排序,插入排序-简单插入排序.shell排序,交换排序-冒泡排序.快速排序,归并排序,计数排序). 插入排序还可以和 ...

  9. c语言:链表排序, 链表反转

    下面将实现链表排序的排序和遍历显示功能: 所定义的链表结构如下: head -> p1 -> p2 ->p3 ->....->pn; head的本身不作为数据节点,hea ...

随机推荐

  1. tomcat启动项目内存溢出问题

    catalina.bat文件的第二行加下面的即可: 注意最大内存设置,和系统的内存有关系 set JAVA_OPTS=%JAVA_OPTS% -Xms512m -Xmx1024m -XX:PermSi ...

  2. 什么是NSAssert?

    断言, 判断是否符合某个特定条件, 符合就继续运行程序, 反之就抛出异常, 后面为自定义错误提示, 也可以使用NSParameterAssert, 在调试上有着很大的方便 int a = 0; NSA ...

  3. Javascript闭包简单理解

    提到闭包,想必大家都早有耳闻,下面说下我的简单理解.平时写代码.第三方框架和组件都或多或少用到了闭包.所以,了解闭包是非常必要的.呵呵... 一.什么是闭包简而言之,就是能够读取其他函数内部变量的函数 ...

  4. python列表、字典与csv

    在日常数据分析时最常打交道的是csv文件和list,dict类型.涉及到的主要需求有: 将一个二重列表[[],[]]写入到csv文件中 从文本文件中读取返回为列表 将一字典写入到csv文件中 从csv ...

  5. C++虚基类详解(转)

    我们知道,如果一个派生类有多个直接基类,而这些直接基类又有一个共同的基类,则在最终的派生类中会保留该间接共同基类数据成员的多份同名成员.在引用这些同名的成员时,必须在派生类对象名后增加直接基类名,以避 ...

  6. 【USACO 2.3.1】最长前缀

    [题目描述] 在生物学中,一些生物的结构是用包含其要素的大写字母序列来表示的.生物学家对于把长的序列分解成较短的序列(即元素)很感兴趣. 如果一个集合 P 中的元素可以通过串联(元素可以重复使用,相当 ...

  7. AutoIt3初探(1)

    AutoIt3可实现系统操作,键盘鼠标模拟,是自动化测试的一个好工具. 这个是在线帮助文档,http://www.jb51.net/shouce/autoit/ 需要先下载一个autoIt安装,然后将 ...

  8. linux常用svn命令(转载)

     原地址:http://www.rjgc.net/control/content/content.php?nid=4418       1.将文件checkout到本地目录svn checkout p ...

  9. 如何编写pythonGNURADIO应用

    三个基本概念: flow graph 很大一部分GNURADIO程序就是一个流图.流图包括若干信号处理模块(BLock),以及一些用表示数据流的边. BLock 所有信号处理过程在block中进行.在 ...

  10. 《FPGA零基础入门到精通视频教程》-第001a讲软件的安装

    高清视频和配套讲义这里下载 http://www.fpgaw.com/thread-67758-1-1.html 优酷视频不是很清晰