题目:

在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。

示例 1:

输入: 4->2->1->3
输出: 1->2->3->4

示例 2:

输入: -1->5->3->4->0
输出: -1->0->3->4->5

解题思路:

可达到O(nlogn)的排序我们知道有三种,堆排、快排、二路归并。  这里由于是链表,堆排和归并都不太容易操作。所以这里我们用二路归并算法。

二路归并有递归的和非递归的,这里单链表,用非递归较为简单。因为递归要比较两个区间的大小,这里需要用到双指针。

代码:

 /**
* 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;
ListNode *p = head;
int len = ;
while(p) {
len++;
p = p->next;
} ListNode *temp = new ListNode();
temp->next = head; int interval;
for(interval = ; interval <= len; interval *= ) { //从下往上归并 ListNode *pre = temp;
ListNode *first = temp->next;
ListNode *second = temp->next; while(first && second) {
int i = ;
while(i < interval && second) {
second = second->next;
i++;
}
int fvisit = ;
int svisit = ;
while(fvisit < interval && svisit < interval && first && second) {
if(first->val < second->val) { //前指针较小,则把前指针装入放在前头
pre->next = first;
pre = first;
first = first->next;
fvisit++;
}
else {
pre->next = second;
pre = second;
second = second->next;
svisit++;
}
}
while(fvisit < interval && first) {//剩下的较大的就依次接上就好
pre->next = first;
pre = first;
first = first->next;
fvisit++;
}
while(svisit < interval && second) {
pre->next = second;
pre = second;
second = second->next;
svisit++;
}
pre->next = second; //往后继续直到第一次排序结束
first = second;
}
}
ListNode *ans = temp->next;
delete temp;
return ans;
}
};

最新文章

  1. opencv2 使用鼠标绘制矩形并截取和保存矩形区域图像
  2. Eclipse程序员要掌握的常用快捷键
  3. centos 6.X 安装scrapy-原创
  4. Jquery手册
  5. (转载)前端构建工具gulp使用
  6. POJ 2017
  7. hdu 4652 Dice 概率DP
  8. WebDriver运行异常列表
  9. wavecom短信猫常用AT命令
  10. Java 中 StringBuilder 在高性能用法总结
  11. js 实现win7任务栏拖动效果
  12. Spring基础知识之依赖注入
  13. ●SPOJ 8222 NSUBSTR–Substrings
  14. .NET Core微服务系列基础文章索引(目录导航Final版)
  15. IDEA鼠标显示javadoc的设置
  16. 二、K8S镜像问题
  17. 无法启动MYSQL服务”1067 进程意外终止”解决的方法
  18. Kattis之旅——Divisible Subsequences
  19. Pyhton基础知识(一)
  20. parallelogram

热门文章

  1. (转)A Recipe for Training Neural Networks
  2. 本地连接属性:Internet协议版本4(TCP/IPv4)打开闪退解决办法
  3. WSGI协议主要包括server和application两部分:
  4. CentOS7.5下安装、配置MySql数据库 --CentOS7.5
  5. Amazon 刷单的几种方式及安全性?
  6. MIUI8系统完整刷入开发版开启root权限的经验
  7. vue日历控件,自定义选择年月 选择年月日 选择年月日时 选择年月日时分,自定义日期范围
  8. 开发者的自测利器-Hprof命令(寻找cpu热点)
  9. hbase的api操作之过滤器
  10. PHP获取POST的几种方法