解题思路:

这道题目,如果不借助其它stl工具,只是使用本身的ListNode的话,最主要的一个问题是,每次找插入位置的时候,没有办法进行从后往前回溯,所以只能从head头结点往后比较,然后找出应当插入的位置为tmp_last之后。

程序的大循环是遍历一次整个链表。cur表示当前访问比较的节点,用last记录cur的上一个节点。每一次去找插入的位置,从head开始往后,进行比较,找到的插入位置分为三种情况:

1、插入为头节点;

2、cur元素插入位置就是当前位置,所以只需将cur和last向后顺移一位就行;

3、cur元素的插入位置为tmp_last和tmp之间,在tmp_last之后。

/*** 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;ListNode* last = head;ListNode* cur = head->next;//遍历整个链表while(cur != NULL){ListNode* tmp = head;ListNode* tmp_last = tmp;while(tmp != NULL && tmp->val < cur->val){tmp_last = tmp;tmp = tmp->next;}if(tmp == tmp_last){ //说明cur元素是要插在表头的last->next = cur->next;cur->next = head;head = cur;cur = last->next;}else if(tmp == cur){ //说明前面的元素均小于cur节点的值last = cur;cur = cur->next;}else{ //否则,cur元素插入在tmp_last后面last->next = cur->next;cur->next = tmp_last->next;tmp_last->next = cur;cur = last->next;}}return head;}
};

Leetcode 147. 对链表进行插入排序 解题思路及C++实现相关推荐

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

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

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

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

  3. leetcode 147. 对链表进行插入排序

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

  4. Leetcode 382. 链表随机节点 解题思路及C++实现

    解题思路: 因为题目中要求需要常数级的空间复杂度,所以就需要计算链表长度了. /*** Definition for singly-linked list.* struct ListNode {* i ...

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

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

  6. Leetcode 125. 验证回文串 解题思路及C++实现

    解题思路: 利用头尾双指针:i ,j . 需要判断每一个字符是否为字母或数字,c++中对应的函数为 isalnum,如果不是字母或数字,返回0. c++中判断大小写字母字符的函数是 isalpha,是 ...

  7. Leetcode 172. 阶乘后的零 解题思路及C++实现

    解题思路: 找阶乘后的零,本质上是找相乘的因子中5的个数,一般情况中,5的倍数中包含一个因子5,但是5的指数次方如25,就包含了2个因子5,这个要注意. class Solution { public ...

  8. Leetcode 171. Excel表列序号 解题思路及C++实现

    解题思路: 26进制转10进制.没啥可说的了. class Solution { public:int get_26(int n){int res = 1;while(n > 0){res *= ...

  9. Leetcode 168. Excel表列名称 解题思路及C++实现

    解题思路: 相当于实现了一个10进制转26进制. 要注意减 1 . class Solution { public:string convertToTitle(int n) {char a[26] = ...

最新文章

  1. Mac下使用Homebrew 安装MySQL
  2. QQ音乐的各种相关API
  3. oracle安装完成EM不能登录,oracle数据库不能登录em问题的解决方法
  4. numpy矩阵计算GPU加速库:cupy
  5. 网络编程基础之C/S架构和TCP/IP协议
  6. VTK:二次方用法实战
  7. C++学习——抽象类
  8. 关于ThreadPool.RegisterWaitForSingleObject和WaitHandle的应用介绍
  9. PyQt5自定义信号与槽带示例讲解
  10. java interceptor用法_java自定义拦截器用法实例
  11. excek快速删除指定行
  12. GitHub:围剿Python计划!程序员:早知必有一战!你站谁?
  13. python从入门到实践课后题_Python 从入门到实践 函数篇 8-6-8习题
  14. centos 7 yum php swoole_自动化部署技能—搭建企业级YUM仓库
  15. 刀友访谈:哪有什么天生的设计大师,有的是长久的喜爱坚持
  16. uni-app项目打包为app
  17. 英文写作第一反应词替换表
  18. 高效windows快捷键
  19. 强化学习入门项目spinning up(1)安装
  20. 红楼梦人物分析系统c语言,红楼梦人物分析.doc

热门文章

  1. kali linux 渗透测试 01 kali介绍
  2. Starry Night [USACO]
  3. JS中的NaN和isNaN,简直是双重人格?
  4. __block和__weak修饰符的区别
  5. [爬虫]通过url获取连接地址中的数据
  6. 第一个问题就难倒我了!
  7. [Flex]Flex SDK 4(Gumbo)更方便的自定义样式、自定义SparkSkin(三)
  8. [转]SQL交叉表实例
  9. 表达对别人的感激之情
  10. ubuntu10.04开启root登陆