Leetcode 147. 对链表进行插入排序 解题思路及C++实现
解题思路:
这道题目,如果不借助其它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++实现相关推荐
- 插入排序 链表 java_Java实现 LeetCode 147 对链表进行插入排序
147. 对链表进行插入排序 对链表进行插入排序. 插入排序的动画演示如上.从第一个元素开始,该链表可以被认为已经部分排序(用黑色表示). 每次迭代时,从输入数据中移除一个元素(用红色表示),并原地将 ...
- LeetCode 147. 对链表进行插入排序(链表)
1. 题目 对链表进行插入排序. 插入排序的动画演示如上.从第一个元素开始,该链表可以被认为已经部分排序(用黑色表示). 每次迭代时,从输入数据中移除一个元素(用红色表示),并原地将其插入到已排好序的 ...
- leetcode 147. 对链表进行插入排序
对链表进行插入排序. 插入排序的动画演示如上.从第一个元素开始,该链表可以被认为已经部分排序(用黑色表示). 每次迭代时,从输入数据中移除一个元素(用红色表示),并原地将其插入到已排好序的链表中. 插 ...
- Leetcode 382. 链表随机节点 解题思路及C++实现
解题思路: 因为题目中要求需要常数级的空间复杂度,所以就需要计算链表长度了. /*** Definition for singly-linked list.* struct ListNode {* i ...
- Leetcode 147.对链表进行排序
对链表进行插入排序 对链表进行插入排序. 插入排序算法: 插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表. 每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它 ...
- Leetcode 125. 验证回文串 解题思路及C++实现
解题思路: 利用头尾双指针:i ,j . 需要判断每一个字符是否为字母或数字,c++中对应的函数为 isalnum,如果不是字母或数字,返回0. c++中判断大小写字母字符的函数是 isalpha,是 ...
- Leetcode 172. 阶乘后的零 解题思路及C++实现
解题思路: 找阶乘后的零,本质上是找相乘的因子中5的个数,一般情况中,5的倍数中包含一个因子5,但是5的指数次方如25,就包含了2个因子5,这个要注意. class Solution { public ...
- Leetcode 171. Excel表列序号 解题思路及C++实现
解题思路: 26进制转10进制.没啥可说的了. class Solution { public:int get_26(int n){int res = 1;while(n > 0){res *= ...
- Leetcode 168. Excel表列名称 解题思路及C++实现
解题思路: 相当于实现了一个10进制转26进制. 要注意减 1 . class Solution { public:string convertToTitle(int n) {char a[26] = ...
最新文章
- Mac下使用Homebrew 安装MySQL
- QQ音乐的各种相关API
- oracle安装完成EM不能登录,oracle数据库不能登录em问题的解决方法
- numpy矩阵计算GPU加速库:cupy
- 网络编程基础之C/S架构和TCP/IP协议
- VTK:二次方用法实战
- C++学习——抽象类
- 关于ThreadPool.RegisterWaitForSingleObject和WaitHandle的应用介绍
- PyQt5自定义信号与槽带示例讲解
- java interceptor用法_java自定义拦截器用法实例
- excek快速删除指定行
- GitHub:围剿Python计划!程序员:早知必有一战!你站谁?
- python从入门到实践课后题_Python 从入门到实践 函数篇 8-6-8习题
- centos 7 yum php swoole_自动化部署技能—搭建企业级YUM仓库
- 刀友访谈:哪有什么天生的设计大师,有的是长久的喜爱坚持
- uni-app项目打包为app
- 英文写作第一反应词替换表
- 高效windows快捷键
- 强化学习入门项目spinning up(1)安装
- 红楼梦人物分析系统c语言,红楼梦人物分析.doc
热门文章
- kali linux 渗透测试 01 kali介绍
- Starry Night [USACO]
- JS中的NaN和isNaN,简直是双重人格?
- __block和__weak修饰符的区别
- [爬虫]通过url获取连接地址中的数据
- 第一个问题就难倒我了!
- [Flex]Flex SDK 4(Gumbo)更方便的自定义样式、自定义SparkSkin(三)
- [转]SQL交叉表实例
- 表达对别人的感激之情
- ubuntu10.04开启root登陆