题目描述:

插入排序的动画演示如上。从第一个元素开始,该链表可以被认为已经部分排序(用黑色表示)。
每次迭代时,从输入数据中移除一个元素(用红色表示),并原地将其插入到已排好序的链表中。

插入排序算法:

    1. 插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。

    2. 每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。

    3. 重复直到所有输入数据插入完为止。

题目分析:

从链表头部开始遍历,记录当前要插入排序的节点和其上一个节点,对每个节点执行如下操作:

1.从头部开始找到当前节点之前第一个不大于它的节点,记录找到的节点以及它前一个节点;

2.如果它前一个节点为空,说明要插入到头节点之前,若不为空,则插入到该节点之后;

3.继续进行下一次插入排序,直到遍历到链表尾部。

按照题目分析,该算法的时间复杂度是O(n^2)。依次获取链表中的节点进行插入,插入的时候,在已排序的前半部分链表中确定位置,最终完成整个链表的排序过程。

1.特殊情况:空链表和单个节点的直接返回head;

2.为了方便在头节点之前进行插入,我们在头节点之前插入一个无效的节点,并将这个节点的值赋值为INT_MIN;

3.定义指针p指向当前准备插入的节点,当p不等于NULL的时候,执行循环,否则插入完毕,跳出程序。同时定义一个rear指针,指向已经排序部分的最后。每次循环,将p赋值为rear的next。

4.内层循环利用temp指针确定应该插入的位置,当temp的值比P的值大的时候退出内层循环,那么退出后会出现2种情况:

5.待插入的节点值比rear的值小,那么P插入到temp之前,rear指针不移动;

6.待插入的节点值比rear的值大,那么P插入到temp之后,P的next赋值为rear的next,rear指针移动到P;

7.最后返回head的next为排序后的链表。

C++实现:

 /**
* 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* newhead = new ListNode(INT_MIN);
newhead->next = head;
head = newhead;
ListNode *rear = head->next;//有序链表最后一个节点
ListNode *p = rear->next;//待排序插入节点
while(p!=NULL){
//将p节点移除
rear->next = p->next;
p->next = NULL;
//确定位置
ListNode *pre = head;//保存插入位置的前一个节点
ListNode *temp = head->next;
while(temp->val <= p->val && temp != rear){
pre = temp;
temp = temp->next;
}
if(temp->val > p->val){
p->next = temp;
pre->next = p;
}else{
p->next = temp->next;
temp->next = p;
rear = p;
}
p = rear->next;
}
return head->next; }
};

LeetCode--147.对链表进行插入排序的更多相关文章

  1. Java实现 LeetCode 147 对链表进行插入排序

    147. 对链表进行插入排序 对链表进行插入排序. 插入排序的动画演示如上.从第一个元素开始,该链表可以被认为已经部分排序(用黑色表示). 每次迭代时,从输入数据中移除一个元素(用红色表示),并原地将 ...

  2. LeetCode 147. 对链表进行插入排序(Insertion Sort List)

    题目描述 对链表进行插入排序. 插入排序的动画演示如上.从第一个元素开始,该链表可以被认为已经部分排序(用黑色表示). 每次迭代时,从输入数据中移除一个元素(用红色表示),并原地将其插入到已排好序的链 ...

  3. LeetCode题解-147 对链表进行插入排序

    对链表进行插入排序. 插入排序的动画演示如上.从第一个元素开始,该链表可以被认为已经部分排序(用黑色表示). 每次迭代时,从输入数据中移除一个元素(用红色表示),并原地将其插入到已排好序的链表中. 插 ...

  4. LeetCode题解-147 对链表进行插入排序 Medium

    对链表进行插入排序. 插入排序的动画演示如上.从第一个元素开始,该链表可以被认为已经部分排序(用黑色表示). 每次迭代时,从输入数据中移除一个元素(用红色表示),并原地将其插入到已排好序的链表中. 插 ...

  5. Leetcode 147.对链表进行排序

    对链表进行插入排序 对链表进行插入排序. 插入排序算法: 插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表. 每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它 ...

  6. leetcode insertionSortList 对链表进行插入排序

    描述: Sort a linked list using insertion sort. 使用插入排序对一个链表进行排序 普通的插入排序,时间复杂度O(n^2) class Solution { pu ...

  7. C#LeetCode刷题-链表

    链表篇 # 题名 刷题 通过率 难度 2 两数相加   29.0% 中等 19 删除链表的倒数第N个节点   29.4% 中等 21 合并两个有序链表 C#LeetCode刷题之#21-合并两个有序链 ...

  8. 【算法题 14 LeetCode 147 链表的插入排序】

    算法题 14 LeetCode 147 链表的插入排序: 解题代码: # Definition for singly-linked list. # class ListNode(object): # ...

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

    Sort a linked list using insertion sort. A graphical example of insertion sort. The partial sorted l ...

  10. [Swift]LeetCode147. 对链表进行插入排序 | Insertion Sort List

    Sort a linked list using insertion sort. A graphical example of insertion sort. The partial sorted l ...

随机推荐

  1. ubuntu snmp Error: unknown payload OID

    ubuntu snmp Error: unknown payload OID 2013-11-12 15:51:48 标签:ubuntu Error snmp unknown payload OID ...

  2. 微服务前端开发框架React-Admin

    前言 React-Admin是基于React16.x.Ant Design3.x的管理系统架构. 采用前后端分离,内置了许多管理系统常用功能,通过一些脚本.封装帮助开发人员快速开发管理系统,集中精力处 ...

  3. Linux-- su和sudo 切换用户

    su 切换用户 用法:su [选项] [-] [用户 [参数]... ] - :以 login-shell 方式进行登录 不加 - :以 no-login-shell 方式进行登录 -c:只进行一次在 ...

  4. Java实现目的选层电梯的调度

    一.前言 本次博客我将简单介绍一下前两次的电梯作业,并简单解析一下我的程序结构,进一步对我的第二次作业的算法核心和一些想法做一些分享,我的电梯设计算法并不是由调度器来决定电梯的捎带与否,而是由电梯自主 ...

  5. CH4402 小Z的袜子(莫队)

    描述 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命-- 具体来说,小Z把这N只袜子从1到N编号, ...

  6. docker 安装 MySQL 8.0

    1.查找镜像 查找Docker Hub上的mysql镜像 X230:~$ docker search mysql NAME DESCRIPTION STARS OFFICIAL AUTOMATED m ...

  7. ubuntu 安装linux 下vmVMware tools 步骤及问题解决

    一. 菜单栏     “虚拟机” ——> “设置 ”     使用linux.so镜像文件    此文件在vmware workstation 的安装目录.并且打开CD/DVD的连接. 二.终端 ...

  8. error:0906D064:PEM routines:PEM_read_bio:bad base64 decode

    今天在使用easywechat对接企业打款到银行卡时,遇到了两个错误 error:0906D064:PEM routines:PEM_read_bio:bad base64 decode 和 erro ...

  9. Delphi XE10.1 引用计数

      以往的Delphi版本,不支持接口的Weak,和UnSafe的引用,支持对象的Weak, UnSafe,而且仅在Android和Ios平台上支持. 现在Delphi XE10.1 Berlin终于 ...

  10. Python学习之——Oracle数据库连接

    一.安装Oracle客户端 1.下载对应安装文件,官网地址:http://www.oracle.com/technetwork/database/database-technologies/insta ...