力扣原题:

先贴代码:

public class Solution147 {public ListNode insertionSortList(ListNode head) {//当链表为空时,不需排序,直接返回if (head == null){return head;}//创建一个虚拟头节点,方便处理头节点ListNode newhead = new ListNode(-1);newhead.next = head;//ret为待排序的节点ListNode ret = head.next;//进入循环,直到待排序的节点为空(不存在待排序的节点)while (ret != null){//情况1:头节点小于等于待排序节点if (head.val <= ret.val){head = head.next;//情况2:头节点大于待排序节点}else {//新建一个cur节点来寻找前面有序链表中大于待排序节点的节点,插入它的前面ListNode cur = newhead;while (cur.next.val <= ret.val){cur = cur.next;}head.next = ret.next;ret.next = cur.next;cur.next = ret;}ret = head.next;}return newhead.next;}
}

思路解析:

本题中要求我们使用插入排序进行解题,那么什么是插入排序呢?

1、插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。
2、每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,       并将其插入。
3、重复直到所有输入数据插入完为止。

由上可知,我们先需要在链表中标记一个节点,记为ret待排序节点。将这个节点和链表的头节点进行比较判断大小,若ret节点大于等于头节点,则说明该节点应该排在头节点的后面,这样我们就得到了一小段的有序链表。ret节点为该有序链表的尾巴节点。

使头节点和ret节点都后移一位,这样头节点就又成了有序链表中的尾巴节点(之前头节点的前面没有节点,只有它一个节点,默认为有序链表的尾巴节点)。

不断的将后面的节点与前面有序链表的尾巴节点进行比较,大于尾巴节点则在后面,若小于尾巴节点,就会进入前面的有序链表再和有序链表里的各节点比较,找到大于待排序链表的节点,插入到它的前面。

如下图(图画的不好勿怪),若ret大于等于head,则不需要插入;若ret小于head,则进入head前面的有序链表再次排序找合适的位置(找到大于ret的节点,放在这个节点的前面):

至于为什么不是再前面有序链表中找小于ret节点的节点排在它的后面?因为若后面还有大于ret小于head的节点的话,那么再进入前面的链表的时候就会混乱,无法再排序。

对链表进行插入排序。从第一个元素开始,该链表可以被认为已经部分排序。每次迭代时,从输入数据中移除一个元素,并原地将其插入到已排好序的链表中。相关推荐

  1. C语言将一个数插入到已排好序的数组中

    #include<stdio.h> #define N 5 int main(){void fun(int *,int);int a[N+1],n,i;printf("请输入%d ...

  2. 算法练习day9——190327(“之” 字形打印矩阵、在行列都排好序的矩阵中找数、打印两个有序链表的公共部分、判断一个链表是否为回文结构)

    1."之" 字形打印矩阵 [题目] 给定一个矩阵matrix, 按照"之" 字形的方式打印这个矩阵, 例如: 1 2 3 4 5 6 7 8 9 10 11 1 ...

  3. 有一个已排好序的数组,要求输入一个数后,按原来排序的规律将它插入数组中,谭浩强《c语言程序设计》第六章第四题

    题目 本题是谭浩强<c语言程序设计>第六章第四题 题目:有一个已排好序的数组,要求输入一个数后,按原来排序的规律将它插入数组中. 以下是本篇文章正文内容,欢迎朋友们进行指正,一起探讨,共同 ...

  4. 在主函数中输入10个等长的字符串。用另一函数对它们排序。然后在主函数输出这10个已排好序的字符串。

    在主函数中输入10个等长的字符串.用另一函数对它们排序.然后在主函数输出这10个已排好序的字符串. 解题思路: 排序方式与数字比较没什么不同,先遍历比较找出最大的字符串,与第一个字符串进行交换,然后剩 ...

  5. C语言学习之有一个已排好序的数组,要求输入一个数后,按原来排序的规律将它插入数组中

    有一个已排好序的数组,要求输入一个数后,按原来排序的规律将它插入数组中 #include <stdio.h> void main(){int a[11]={25,32,65,74,84,9 ...

  6. 数组合并假设有 n 个长度为 k 的已排好序(升序)的数组,请设计数据结构和算法,将这 n 个数组合并到一个数组,且各元素按升序排列。即实现函数-C-icoding-排序-数据结构

    数组合并 假设有 n 个长度为 k 的已排好序(升序)的数组,请设计数据结构和算法, 将这 n 个数组合并到一个数组,且各元素按升序排列.即实现函数: void merge_arrays(const ...

  7. C语言,有一个已排好序的数组,要求输入一个数后,按原来排序的规律将它插入数组中

    C语言,有一个已排好序的数组,要求输入一个数后,按原来排序的规律将它插入数组中 代码: #include <stdio.h> int main() {int a[11]={1,2,3,4, ...

  8. 有一个已排好序的数组,要求输入一个数后,按原来排序的规律将它插入数组中——C语言

    1 概述 有一个已排好序的数组,要求输入一个数后,按原来排序的规律将它插入数组中. 2 解法 //C程序设计第五版(谭浩强) //章节:第六章 利用数组处理批量数据 //题号:6.4 //题目:有一个 ...

  9. c语言:“有一个已排好序的数组,要求输入一个数后,按原来的规律将它插入数组中” 的程序分析及详细代码

    先来分析思路: 已经排好序的数组,有两种情况,一种是顺序,一种是逆序,由于该数组是自己给出的,所以我们不妨将该数组的顺序设为顺序. 1.我们需要创建一个顺序数组(a[ ]),创建时要注意,我们要确保数 ...

  10. 有一个已排好序的数组,要求输入一个数后,按原来排序的规律将它插入数组中

    有一个已排好序的数组,要求输入一个数后,按原来排序的规律将它插入数组中(C语言) 题目要求:如标题 思路: 如果一个数列由小到大排列,则对数列进行反向遍历.当遇到输入的数x大于a[i]时,就跳出循环 ...

最新文章

  1. 项目进度,你汇报清楚了么?
  2. linux驱动之i2c学习
  3. crtlc不能复制文件_ctrl+c不能复制怎么办
  4. 每周分享五个 PyCharm 使用技巧(一)
  5. C# 中的只读结构体(readonly struct)
  6. C - Log Calculator FZU - 2036
  7. 主角的创建与选择 Learn Unreal Engine (with C++)
  8. 从计算机基础知识到机器学习第1堂课,最适合新手的5场直播来了
  9. 制作内网yum源 同步阿里的源
  10. python网络通信效率_Python之网络通信
  11. 会议服务器维护保养,关于视频会议系统的维护和保养方法
  12. oracle11数据库下载地址并安装使用
  13. csv转vcf格式网页工具-快速导入手机通讯录
  14. Win10卸载edge浏览器与后悔重装
  15. java通用教务管理系统_基于java的教务管理系统.doc
  16. 电脑/手机怎么查看连接的wifi的密码
  17. Python监控动态日志
  18. Numpy + Matplotlib 绘制白色画图
  19. python列表lambda表达式排序sort(key=lambda x:x[1])
  20. 一位清华差生9年的北京生活

热门文章

  1. 1-9 requests模块之爬取4k高清壁纸(xpath解析)
  2. 国际电离层参考模型程序说明
  3. Ubuntu16.04中修复Pycharm问号图标问题
  4. Intent跳转页面大全
  5. Intent.ACTION_VIEW
  6. 华为云OBS数据桶使用
  7. 小知识:什么是HotFix?HotFix安装步骤及注意事项
  8. 个人博客如何申请ICP备案
  9. Unity 使用Mirror制作联机游戏
  10. Swift All-In-One安装指南