链表系列文章(四)

上一篇讨论了链表的反转问题,这一篇讨论链表排序的问题

1. 排序两个有序链表

比较简单,属于归并排序,不再赘述

时间复杂度O(n), 空间复杂度O(1)

 1 ListNode *mergeList( ListNode *list1, ListNode *list2 ) {
 2     if(!list1 || !list2) return list1 ? list1 : list2;
 3     ListNode res(-1), *phead = &res;
 4     while(list1 && list2) {
 5         if(list1->digit < list2->digit) { phead->next = list1; list1 = list1->next; }
 6         else { phead->next = list2; list2 = list2->next; }
 7         phead = phead->next;
 8     }
 9     phead->next = list1 ? list1 : list2;
10     return res.next;
11 }

2. 单链表排序

方法一:递归+分治

时间复杂度O(nlogn),空间复杂度O(nlogn)

 1 ListNode *sortList(ListNode *head) {
 2     if(NULL == head || NULL == head->next)
 3         return head;
 4     ListNode *fast = head, *slow = head;
 5     while(fast->next && fast->next->next) {slow = slow->next; fast = fast->next->next;}
 6     fast = slow->next;
 7     slow->next = NULL;//divide
 8     head = sortList(head);
 9     fast = sortList(fast);
10     ListNode res(INT_MIN);
11     slow = &res;
12     while(head && fast) {//merge
13         if(head->val < fast->val) {slow->next = head; head = head->next;}
14         else {slow->next = fast; fast = fast->next;}
15         slow = slow->next;
16     }
17     slow->next = head == NULL ? fast : head;
18     return res.next;
19 }

方法二:迭代法

时间复杂度O(nlogn),空间复杂度O(1)

请参考博客:http://www.cnblogs.com/sosohu/p/4127213.html

由于本人水平有限,文中难免有不当和错误之处,欢迎大家批评指正,愿共同进步!!!

时间: 2024-10-09 16:37:15

链表系列文章(四)的相关文章

JVM系列文章(四):类加载机制

作为一个程序员,仅仅知道怎么用是远远不够的.起码,你需要知道为什么可以这么用,即我们所谓底层的东西. 那到底什么是底层呢?我觉得这不能一概而论.以我现在的知识水平而言:对于Web开发者,TCP/IP.HTTP等等协议可能就是底层:对于C.C++程序员,内存.指针等等可能就是底层的东西.那对于Java开发者,你的Java代码运行所在的JVM可能就是你所需要去了解.理解的东西. 我会在接下来的一段时间,和读者您一起去学习JVM,所有内容均参考自<深入理解Java虚拟机:JVM高级特性与最佳实践>(

链表系列文章(一)

参考 http://www.cnblogs.com/skywang12345/p/3561803.html在此致谢! 采用C++,实现了单链表和双向循环链表: 1. 单链表 1 #ifndef SINGLE_LIST_H 2 #define SINGLE_LIST_H 3 4 #ifndef INT_MAX 5 #define INT_MAX 2147483647 6 #define INT_MIN (-INT_MAX - 1) 7 #endif 8 #define ERROR INT_MIN

Android异步处理系列文章四篇之三

Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面Android异步处理二:使用AsyncTask异步更新UI界面Android异步处理三:Handler+Looper+MessageQueue深入详解Android异步处理四:AsyncTask的实现原理 Android异步处理三:Handler+Looper+MessageQueue深入详解 概述:Android使用消息机制实现线程间的通信,线程通过Looper建立自己的消息循环,MessageQueue是F

Android异步处理系列文章四篇之一使用Thread+Handler实现非UI线程更新UI界面

目录: Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面Android异步处理二:使用AsyncTask异步更新UI界面Android异步处理三:Handler+Looper+MessageQueue深入详解Android异步处理四:AsyncTask的实现原理 Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面 概述:每个Android应用程序都运行在一个dalvik虚拟机进程中,进程开始的时候会启动一个主线程(MainTh

Android异步处理系列文章四篇之二 使用AsyncTask异步更新UI界面

Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面Android异步处理二:使用AsyncTask异步更新UI界面Android异步处理三:Handler+Looper+MessageQueue深入详解Android异步处理四:AsyncTask的实现原理 Android异步处理二:使用AsyncTask异步更新UI界面 概述: AsyncTask是在Android SDK 1.5之后推出的一个方便编写后台线程与UI线程交互的辅助类.AsyncTask的内部实现

链表系列文章(三)

上一篇讨论了链表相关的几个有趣的问题,这一篇主要讨论与反转链表有关的问题 基本数据结构: struct ListNode { int var; ListNode *next; ListNode( int v = 0 ) : var(v), next(NULL) { } }; 1.  反转链表 方法一:堆栈法,利用栈后进先出的特性,将链表节点依次入栈,然后弹出并修改next指针 时间复杂度O(n),空间复杂度O(n) 1 ListNode *reverseList(ListNode *head)

C#网络编程系列文章(四)之TcpListener实现同步TCP服务器

原创性声明 本文作者:小竹zz 本文地址http://blog.csdn.net/zhujunxxxxx/article/details/44258719 转载请注明出处 本文介绍 TcpListener 类提供一些简单方法,用于在阻止同步模式下侦听和接受传入连接请求. 可使用 TcpClient 或 Socket 来连接 TcpListener. 可使用 IPEndPoint.本地 IP 地址及端口号或者仅使用端口号,来创建 TcpListener. 可以将本地 IP 地址指定为 Any,将本

TCP和UDP通信(C#网络编程) ---- 系列文章

文章系列目录 C#网络编程系列文章(一)之Socket实现异步TCP服务器 C#网络编程系列文章(二)之Socket实现同步TCP服务器 C#网络编程系列文章(三)之TcpListener实现异步TCP服务器 C#网络编程系列文章(四)之TcpListener实现同步TCP服务器 C#网络编程系列文章(五)之Socket实现异步UDP服务器 C#网络编程系列文章(六)之Socket实现同步UDP服务器 C#网络编程系列文章(七)之UdpClient实现异步UDP服务器 C#网络编程系列文章(八)

【微信小程序开发?系列文章六】生命周期和路由

这篇文章理论的知识比较多一些,都是个人观点,描述有失妥当的地方希望读者指出. [微信小程序开发•系列文章一]入门 [微信小程序开发•系列文章二]视图层 [微信小程序开发•系列文章三]数据层 [微信小程序开发•系列文章四]模块化 [微信小程序开发•系列文章五]主界面 [微信小程序开发•系列文章六]生命周期和路由 整个微信小程序从打开到关闭,整个过程可以分为很多阶段或者说状态,这一整段的过程,我们称之为小程序的生命周期.而周期中的每种不同的状态,到另一个状态的过度和转化,是需要一个触发机制的,这种机