题目:

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

解题思路:

根据题目要求,可知只能用归并排序,其他排序算法要么时间复杂度不满足,要么空间复杂度不满足

实现代码:

#include <iostream>

using namespace std;
/*
Sort a linked list in O(n log n) time using constant space complexity.
*/
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
struct ListNode
{
int val;
ListNode *next;
ListNode(int x):val(x), next(NULL)
{ } }; void addNode(ListNode* &head, int val)
{
ListNode *newNode = new ListNode(val);
if(head == NULL)
{
head = newNode;
}
else
{
newNode->next = head;
head = newNode;
}
} void PrintList(ListNode *root)
{
ListNode *head = root;
while(head != NULL)
{
cout<<head->val<<"\t";
head = head->next;
}
cout<<endl;
} class Solution {
public:
ListNode *sortList(ListNode *head) {
if(head == NULL || head->next == NULL)
return head;
ListNode *quick = head;
ListNode *slow = head;
while(quick->next && quick->next->next)//通过两个指针,一个走两步、一个走一步,获得链表的中间节点
{
slow = slow->next;
quick = quick->next->next;
}
quick = slow;
slow = slow->next;
quick->next = NULL;//将链表的前半段进行截断
ListNode *head1 = sortList(head);
ListNode *head2 = sortList(slow);
return merge(head1, head2);
} //归并两个有序链表
ListNode *merge(ListNode *head1, ListNode *head2)
{
if(head1 == NULL)
return head2;
if(head2 == NULL)
return head1;
ListNode *newHead = NULL;
if(head1->val < head2->val)
{
newHead = head1;
head1 = head1->next; }
else
{
newHead = head2;
head2 = head2->next;
}
ListNode *p = newHead;
while(head1 && head2)
{
if(head1->val < head2->val)
{
p->next = head1;
head1 = head1->next;
}
else
{
p->next = head2;
head2 = head2->next;
}
p = p->next;
}
if(head1)
p->next = head1;
if(head2)
p->next = head2;
return newHead;
}
}; int main(void)
{
ListNode *head = new ListNode();
addNode(head, );
addNode(head, );
addNode(head, );
PrintList(head); Solution solution;
head = solution.sortList(head);
PrintList(head); return ;
}

LeetCode148:Sort List的更多相关文章

  1. LeetCode:Sort List

    Title: Sort a linked list in O(n log n) time using constant space complexity. 思路:考虑快速排序和归并排序,但是我的快速排 ...

  2. linux命令学习之:sort

    sort命令是在Linux里非常有用,它将文件进行排序,并将排序结果标准输出.sort命令既可以从特定的文件,也可以从stdin中获取输入. 语法 sort  (选项)  (参数) 选项 sort将文 ...

  3. JavaScript:sort() 方法

    ylbtech-JavaScript:sort() 方法 JavaScript sort() 方法 1. 定义和用法返回顶部 sort() 方法用于对数组的元素进行排序. 语法 arrayObject ...

  4. 总结: Sort 排序算法

    排序总结 面试经验 硅谷某前沿小Startup面试时,问到的一个题目就是写一个快速排序算法.进而面试官问到了各种算法的算法复杂度,进而又问了Merge Sort 与 QuickSort 的优劣. 对排 ...

  5. Python排列函数:sort、sorted

    排序函数介绍:sort()和sorted()都属于Python list的排序方法 区别:sort()属于永久性排列,直接改变该list: sorted属于暂时性排列,会产生一个新的序列. #sort ...

  6. linux常用命令:sort 命令

    sort 命令是Linux系统下一种对文件排序的工具,sort 命令功能十分强大,是 Shell 脚本编程是常用的文件排序工具. 1.命令格式: sort [选项]... [文件]... 或:sort ...

  7. R语言学习笔记:sort、rank、order、arrange排序函数

    R语言中排序有几个基本函数:sort().rank().order().arrange() 一.总结 sort()函数是对向量进行从小到大的排序 rank()函数返回的是对向量中每个数值对应的秩 or ...

  8. Linux命令(24) :sort

    转载地址:点击 linux 命令详解 sort是在Linux里非常常用的一个命令,管排序的,集中精力,五分钟搞定sort,现在开始! 1 sort的工作原理 sort将文件的每一行作为一个单位,相互比 ...

  9. Python开发【笔记】:sort排序大法

    浅谈排序 程序中经常用到排序函数,Python 提供了 sort 和 sorted 函数,一个原地排序,一个返回排序后的新结果 1.参数 函数原型: sort([cmp[, key[, reverse ...

随机推荐

  1. 第五章 二叉树(a)树

  2. 【校招面试 之 C/C++】第15题 C 回调函数

    转自:https://segmentfault.com/a/1190000008293902 做略微改动 什么是回调函数 我们先来看看百度百科是如何定义回调函数的: 回调函数就是一个通过函数指针调用的 ...

  3. OC 线程操作 - GCD使用 -同步函数,异步函数,串行队列,并发队列

    - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ // GCD 开几条线程并不是我们 ...

  4. 9-centos定时任务-不起作用- 没指明路径!!!

    crond 是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务 工具,并且会自动启动crond进程,cro ...

  5. Paypal支付

    <!--Paypal支付数据开始--> <input type="hidden" name="charset" value="utf ...

  6. php 框架选择

    背景 很多初级php甚至中级php都会陷入框架选择困难症,要么必须使用什么框架,要么一定不使用什么框架,而对框架的选择带来的效益和负担的成本并不是很清晰 框架大概分为以下这些 1. 简单轻量:tp,c ...

  7. Vim基础教程

    一.简介 世界上只有三种编辑器,EMACS.VIM和其它. 我们所处的时代是非常幸运的,有越来越多的编辑器,相对于古老的VIM和EMACS,它们被称为现代编辑器.我们来看看这两个古董有多大年纪了: * ...

  8. PAT 1083 是否存在相等的差(20)(代码+思路)

    1083 是否存在相等的差(20 分) 给定 N 张卡片,正面分别写上 1.2.--.N,然后全部翻面,洗牌,在背面分别写上 1.2.--.N.将每张牌的正反两面数字相减(大减小),得到 N 个非负差 ...

  9. 合成冷色黑暗恐怖魔法师图片的PS教程

    教程主要使用Photoshop合成黑暗风格的魔法师施法场景,整体的场景效果以冷色风格为主,加上素材的叠加完成最终效果图,希望朋友可以喜欢.效果图: 先把背景拖进去,用工具吧字母弄掉. 加一个调色图层 ...

  10. 02 Maven 入门使用

    Maven 入门使用 1. Maven 项目工程目录约定 Project |-src | |-main | | |-java -- 存放项目的 .java 文件 | | |-resources -- ...