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 [具体分析]的更多相关文章

  1. LeetCode——Insertion Sort List

    LeetCode--Insertion Sort List Question Sort a linked list using insertion sort. Solution 我的解法,假设第一个节 ...

  2. [LeetCode] Insertion Sort List 链表插入排序

    Sort a linked list using insertion sort. 链表的插入排序实现原理很简单,就是一个元素一个元素的从原链表中取出来,然后按顺序插入到新链表中,时间复杂度为O(n2) ...

  3. leetcode Insertion Sort List

    题目:Sort a linked list using insertion sort. 代码: /** * Definition for singly-linked list. * struct Li ...

  4. LeetCode: Insertion Sort List 解题报告

    Insertion Sort List Sort a linked list using insertion sort. SOLUTION: 使用一个dummynode 创建一个新的链,将旧的节点插入 ...

  5. leetcode——Insertion Sort List 对链表进行插入排序(AC)

    Sort a linked list using insertion sort. class Solution { public: ListNode *insertionSortList(ListNo ...

  6. [leetcode]Insertion Sort List @ Python

    原题地址:http://oj.leetcode.com/problems/insertion-sort-list/ 题意:对链表进行插入排序. 解题思路:首先来对插入排序有一个直观的认识,来自维基百科 ...

  7. leetcode:Insertion Sort List

    Sort a linked list using insertion sort. 分析:此题要求在链表上实现插入排序. 思路:插入排序是一种O(n^2)复杂度的算法,基本想法就是每次循环找到一个元素在 ...

  8. LeetCode解题报告:Insertion Sort List

    Insertion Sort List Sort a linked list using insertion sort. leetcode subject思路:标准的插入排序.考察一下链表的操作. 对 ...

  9. [Leetcode Week16]Insertion Sort List

    Insertion Sort List 题解 原创文章,拒绝转载 题目来源:https://leetcode.com/problems/insertion-sort-list/description/ ...

随机推荐

  1. Error: ORA-16501: the Data Guard broker operation failed ORA-16625: cannot reach database

    在备库上建配置文件 DGMGRL> create configuration 'sharkdbbork' as primary database is 'sharkdb' connect ide ...

  2. macbook连接linuxserver后不显示matlab桌面[问题]

    macbook 登录远程linuxserver.Macbook今天,系统版本号10.9.4.这是更新,打开matlab当提醒x11不存在.一个接着安装Xquarz2.7.6. matlab它可以在本地 ...

  3. C++传递函数指针

    函数指针是一个很好的类型.因此,您可以编写一个函数,它的一个参数是一个函数指针.然后.在(外部)当函数使用的函数指针参数,来间接调用时调用相应的参数的函数的函数. 因为指针在不同的情况下能够指向不同的 ...

  4. AMD宣布裁员7% 约710员工将失去工作

    10 月 17 日.美国芯片生产商 AMD 周四宣布将裁员7%.并公布了不及预期的第四季度业绩展望.这将是 AMD 自 2011 年以来的第三轮大裁员. 就在一周之前,AMD 宣布罗瑞德(Rory R ...

  5. 垂死或涅槃重生 -- Delphi XE5 我们将宣布感情的回归

    Delphi 在很大程度上是一个被遗忘我的工具. 无论是在使用RapidSql , 我还没有收到Embarcadero 本公司发行参与邀请Delphi XE5该公告将. 可能有人会问,为什么Embar ...

  6. 解决 - java.lang.OutOfMemoryError: unable to create new native thread

    工作中碰到过这个问题好几次了,觉得有必要总结一下,所以有了这篇文章,这篇文章分为三个部分:认识问题.分析问题.解决问题. 一.认识问题: 首先我们通过下面这个 测试程序 来认识这个问题: 运行的环境  ...

  7. WPF3D学习,立方体的绘制

    原文:WPF3D学习,立方体的绘制 以此为一个好的开始吧!一直都太懒,坚持写文章是个不错的开始!碰巧最近在研究WPF3D这块的知识,也为了练练自己的写作水平,整理这篇文章.新手上路,多多关照! 本文先 ...

  8. 玩转html5(一)-----盘点html5新增的那些酷酷的input类型和属性

    今天正式开始学习html5了,相比html以前的版本,html5新增了好多功能,属性,使我们做出来的界面更加的绚丽,而且使用起来超级简单,这篇文章先来说说html增加的那些input类型和属性. 这些 ...

  9. Spring的文件上传

    Spring在发现包括multipart的请求后,会使用MultipartResolver的实现bean处理文件上传操作,现有採用Servlet3的 org.springframework.web.m ...

  10. 左右Map

    Person p=new Person("黄雄"); Map map=new HashMap(); map.put("p", p); p.setName(&qu ...