LeetCode :: Insertion Sort List [具体分析]
Sort a linked list using insertion sort.
仍然是一个很简洁的题目,让我们用插入排序给链表排序;这里说到插入排序。能够来回想一下, 最主要的入门排序算法。就是插入排序了。时间复杂度为n^2。最主要的插入排序是基于数组实现的。以下给出基于数组实现的插入排序,来体会一个插入排序的思想;
下面仅为数组实现。不是解题代码,没兴趣能够跳过。
void insertionsort (int a[], int N)
{
for (int i = 1; i < N; i++){
int tmp = a[i];
for (int j = i; j >= 0 && a[j] < a[j - 1]; j--) //这里是升序排列,所以是a[j] < a[j - 1]
a[j] = a[j - 1];
a[j] = tmp;
}
}
当做链表的时候,有两点主要差别:一、因为是单向链表。所以和数组不同的是,每一次都从第一个节点向后扫描。寻找合适的插入位置;当然。数组也是能够这种。
二、数组须要挨个替换。我上面的写法在寻找合适位置的同一时候就直接替换了,所以感觉没那么明显,而链表则是在需找到合适位置之后,把待排序节点拿出插入当中。体现了链表的动态性。
/**
* 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 || head->next == NULL)
return head; ListNode *tmp = NULL;
ListNode *pre_tmp = NULL;
ListNode *dummy = new ListNode(0);
ListNode *pos = head->next; //这里用pos指向第一待插入排序数据
ListNode *pre_pos = head;
dummy->next = head; while(pos != NULL){
tmp = dummy->next; //这里一開始写成了 tmp = head 一直错,太不细心了。在引入哑节点之后,
//这里就不能等于head,仅仅有这样才干够从第一个開始扫描開始扫描。
pre_tmp = dummy;
while(tmp->val < pos->val && tmp != pos){ //第二个条件在数组插入排序时事不用推断的。这里须要注意!
pre_tmp = tmp;
tmp = tmp->next;
} if (tmp != pos)
{
pre_pos->next = pos->next;
pre_tmp->next = pos;
pos->next = tmp;
pos = pre_pos;
}
pre_pos = pos;
pos = pos->next;
}
return dummy->next;
}
};
PS:dummy节点对于头节点可能变化的链表来说,引入是一个非常方便的事情,可是要记得链表的起始用dummy->next表示出,而不是使用head,由于head由于改变节点点,它可能不是头节点 orz
版权声明:本文博主原创文章,博客,未经同意不得转载。
LeetCode :: Insertion Sort List [具体分析]的更多相关文章
- LeetCode——Insertion Sort List
LeetCode--Insertion Sort List Question Sort a linked list using insertion sort. Solution 我的解法,假设第一个节 ...
- [LeetCode] Insertion Sort List 链表插入排序
Sort a linked list using insertion sort. 链表的插入排序实现原理很简单,就是一个元素一个元素的从原链表中取出来,然后按顺序插入到新链表中,时间复杂度为O(n2) ...
- leetcode Insertion Sort List
题目:Sort a linked list using insertion sort. 代码: /** * Definition for singly-linked list. * struct Li ...
- LeetCode: Insertion Sort List 解题报告
Insertion Sort List Sort a linked list using insertion sort. SOLUTION: 使用一个dummynode 创建一个新的链,将旧的节点插入 ...
- leetcode——Insertion Sort List 对链表进行插入排序(AC)
Sort a linked list using insertion sort. class Solution { public: ListNode *insertionSortList(ListNo ...
- [leetcode]Insertion Sort List @ Python
原题地址:http://oj.leetcode.com/problems/insertion-sort-list/ 题意:对链表进行插入排序. 解题思路:首先来对插入排序有一个直观的认识,来自维基百科 ...
- leetcode:Insertion Sort List
Sort a linked list using insertion sort. 分析:此题要求在链表上实现插入排序. 思路:插入排序是一种O(n^2)复杂度的算法,基本想法就是每次循环找到一个元素在 ...
- LeetCode解题报告:Insertion Sort List
Insertion Sort List Sort a linked list using insertion sort. leetcode subject思路:标准的插入排序.考察一下链表的操作. 对 ...
- [Leetcode Week16]Insertion Sort List
Insertion Sort List 题解 原创文章,拒绝转载 题目来源:https://leetcode.com/problems/insertion-sort-list/description/ ...
随机推荐
- 重新启动IIS服务的方法
WINDOWS提供WEB服务的IIS有时候会出现訪问过大导致站点打不开,这时重新启动IIS是最好的选择. 1.界面操作 打开"控制面板"->"管理工具"- ...
- 简介支持向量机热门(认识SVM三位置)
支持向量机通俗导论(理解SVM的三层境地) 作者:July .致谢:pluskid.白石.JerryLead.出处:结构之法算法之道blog. 前言 动笔写这个支持向量机(support vector ...
- spring3.0注解定时任务配置及说明
spring注解方式的定时任务配置: 第一步:spring配置文件 <?xml version="1.0" encoding="UTF-8"?> & ...
- 如何自动以管理员身份运行.NET程序?
原文:如何自动以管理员身份运行.NET程序? windows 7和vista提高的系统的安全性,同时需要明确指定“以管理员身份运行”才可赋予被运行软件比较高级的权限,比如访问注册表等.否则,当以普通身 ...
- 重新想象 Windows 8 Store Apps (8) - 控件之 WebView
原文:重新想象 Windows 8 Store Apps (8) - 控件之 WebView [源码下载] 重新想象 Windows 8 Store Apps (8) - 控件之 WebView 作者 ...
- C# Windows Phone 8 WP8 , 文字超连结到网页 免打程式码,Xaml就搞定 ! !
原文:C# Windows Phone 8 WP8 , 文字超连结到网页 免打程式码,Xaml就搞定 ! ! 一般我们在开发Windows Phone 8 APP ,有时会需要超连结连到其他的网页,但 ...
- Android:自己定义PopupMenu的样式(显示图标/设置RadioButton图标)
PopupMenu是Android中一个十分轻量级的组件.与PopupWindow相比,PopupMenu的可自己定义的能力较小,但使用更加方便. 先上效果图: 本例要实现的功能例如以下: 1.强制显 ...
- 【SICP感应】1 工艺和替代模式
<计算机程序的构造和解释>这本书的目的不是要解释的编程语言的语法,它是一种. 不是在你的语句知识,但是,你要教的东西做什么. 这是一个过程,一个精神. 就是所谓的程序规则的模式. 书中用了 ...
- DiskFileUpload类
1.2.2 DiskFileUpload类 DiskFileUpload类是Apache文件上传组件的核心类,应用程序开发者通过这个类来与Apache文件上传组件进行交互.以下介绍DiskFileUp ...
- C# WinForm多线程(一)Thread类库
Windows是一个多任务的系统,如果你使用的是windows 2000及其以上版本,你可以通过任务管理器查看当前系统运行的程序和进程.什么是进程呢?当一个程序开始运行时,它就是一个进程,进程所指包括 ...