LeetCode_Insertion Sort List
题目:Sort a linked list using insertion sort,即仿照插入排序(直接插入排序)对一个链表排序。
插入排序的思想:总共进行n-1趟排序,在排列第i个元素时,前面的i个元素是有序的,将第i个元素插入到前i个元素中,并且保证被插入的数组是有序的,数组是顺序存储的,因此向有序的数组插入一个元素时,需要从插入位置之后的各个元素后移。这就是插入排序的思想。插入排序的时间复杂度O(n^2),是稳定的排序方法。链表并不是顺序存储,因此,再将第i个节点插入到前i个节点,并保证有序时,需要指针的复杂运算。
要判断一次插入是否是插入到链表的最前方,因为这样会有head指针的变化。插入时,需要找到插入位置,且找到插入位置的前驱节点,找到并且找到待插节点的前驱。这个题目本身不难,但是花了好长时间,终于AC,思路值得记下来,也许到了用的上的时候就写不出来了,常看看。。。。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *insertionSortList(ListNode *head) {
if(head == NULL) return NULL;
if(head->next==NULL) return head;
// ListNode *p = head;
ListNode *q = head->next;
while(q!=NULL)
{
ListNode *f = head;
while(f!=q)
{
if(q->val < f->val)
{
ListNode *qf = f;
while(qf->next!=q)
{
qf = qf->next;
}//找到q的前驱节点
if(f==head)
{
head = q;
qf->next = q->next;
q->next = f;
q = qf->next;
}
else
{
ListNode *p = head;
while(p->next!=f)
{
p = p->next;
}//找到待插入节点的前驱
qf->next = q->next;
q->next = f;
p->next = q;
q = qf->next;
}
break;
}
else
{
f = f->next;
}
}
if(f==q)
q=q->next;
}
return head;
}
};
LeetCode_Insertion Sort List的更多相关文章
- [算法]——归并排序(Merge Sort)
		归并排序(Merge Sort)与快速排序思想类似:将待排序数据分成两部分,继续将两个子部分进行递归的归并排序:然后将已经有序的两个子部分进行合并,最终完成排序.其时间复杂度与快速排序均为O(nlog ... 
- [算法]——快速排序(Quick Sort)
		顾名思义,快速排序(quick sort)速度十分快,时间复杂度为O(nlogn).虽然从此角度讲,也有很多排序算法如归并排序.堆排序甚至希尔排序等,都能达到如此快速,但是快速排序使用更加广泛,以至于 ... 
- shell之sort命令
		1 sort的工作原理 sort将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出. [rocrocket@rocrocket progr ... 
- 详细解说 STL 排序(Sort)
		0 前言: STL,为什么你必须掌握 对于程序员来说,数据结构是必修的一门课.从查找到排序,从链表到二叉树,几乎所有的算法和原理都需要理解,理解不了也要死记硬背下来.幸运的是这些理论都已经比较成熟,算 ... 
- SQL Tuning 基础概述06 - 表的关联方式:Nested Loops Join,Merge Sort Join & Hash Join
		nested loops join(嵌套循环) 驱动表返回几条结果集,被驱动表访问多少次,有驱动顺序,无须排序,无任何限制. 驱动表限制条件有索引,被驱动表连接条件有索引. hints:use_n ... 
- js sort() reverse()
		数组中存在的两个方法:sort()和reverse() 直接用sort(),如下: ,,,,,,,,,,,]; console.log(array.sort());ps:[0, 1, 2, 2, 29 ... 
- Java中的经典算法之冒泡排序(Bubble Sort)
		Java中的经典算法之冒泡排序(Bubble Sort) 神话丿小王子的博客主页 原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一 ... 
- 2.sort 排序命令讲解
		sort命令 sort:文本排序,仅仅是对显示文件的排序,而不影响源文件的顺序,是根据ASSII码 的字符升序来排列的. -n:安装数值大小从小到大排列 ,默认是升序. ... 
- 基本shell编程【3】- 常用的工具awk\sed\sort\uniq\od
		awk awk是个很好用的东西,大量使用在linux系统分析的结果展示处理上.并且可以使用管道, input | awk '' | output 1.首先要知道形式 awk 'command' fi ... 
随机推荐
- R ggplot2 翻转坐标
			p <- ggplot(mpg, aes(class, hwy)) p + geom_boxplot() p + geom_boxplot() + coord_flip() 
- IOS让返回按钮显示自定义标题而不是上个ViewController的title
			在开发IOS的时候发现当从一个ViewController跳转到另一个ViewController时,被跳转到的那个ViewController的返回按钮总是显示的是上个ViewController的 ... 
- html5shiv.js分析-读源码之javascript系列
			xiaolingzi 发表于 2012-05-31 23:42:29 首先,我们先了解一下html5shiv.js是什么. html5shiv.js是一套实现让ie低版本等浏览器支持html5标签的解 ... 
- Nginx服务器防止被压力测试
			最近经常用人帮忙做压力测试,用webbech或者ab等一些工具模拟并发压服务器,若服务器没有限制连接数或带宽,服务器很容易被压跨.cat nginx.conf…http {…limit_conn_zo ... 
- 错题0925-java
			1.Given the following code: public class Test { private static int j = 0; private static Boolean met ... 
- Apt encounters errors with bad GPG keys [duplicate]
			cd /var/lib/apt sudo mv lists lists.old sudo mkdir -p lists/partial sudo apt-get update 转自: http://a ... 
- ERROR getting 'android:label' attribute: attribute is not a string value
			这个的原因很多地方都有描述,原因多半是多国语言string.xml 有的有这个值, 有的没有. 关键是怎么定位? 实际上他报错的是当前处理的xml element有问题, 而出错的时候盖住了要处理的. ... 
- Loadrunner测试实例分析
			LoadRunner性能测试结果分析是个复杂的过程,通常可以从结果摘要.并发数.平均事务响应时间.每秒点击数.业务成功率.系统资源.网页细分图.Web服务器资源.数据库服务器资源等几个方面分析,如图1 ... 
- MySQL--执行mysql脚本及其脚本编写
			http://www.cnblogs.com/kex1n/archive/2010/03/26/2286504.html 
- 去除 \ufeff
			语言:python 编程工具:pycharm 硬件环境:win10 64位 读取文件过程中发现一个问题:已有记事本文件(非空),转码 UTF-8,复制到pycharm中,在开始位置打印结果会出现 \ ... 
