Insertion Sort List
Sort a linked list using insertion sort.
题目很短,注意:画图,解决边界,特殊情况。插入指针的时候要注意保存原来node的next,这个很容易出错。
一定要优先考虑到头指针和尾指针和空指针的情况。
下面给出完整程序了:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
class Solution {
public:
ListNode *insertionSortList(ListNode *head) {
if(!head) return nullptr;
ListNode *newH = new ListNode(head->val);
ListNode *headTemp = head->next;
while (headTemp)
{
insertNode(newH, headTemp);
}
return newH;
}
ListNode *findListPos(ListNode *(&h), ListNode *(&node))
{
ListNode *htemp = h;
while (htemp->next && htemp->next->val <= node->val)
{
htemp = htemp->next;
}
return htemp;
}
void insertNode(ListNode *(&h),ListNode *(&node))
{
if(!node) return;
if (!h || node->val < h->val)
{
//注意:那里都要注意保存->next的值之后再插入
ListNode *nodeNext = node->next;
node->next = h;
h = node;
node = nodeNext;
return;
}
//注意这里的插入操作,很麻烦,一定要熟悉!!!
ListNode *htemp = findListPos(h, node);
ListNode *saveNode = htemp->next;
ListNode *nodeNext = node->next;
htemp->next = node;
node->next = saveNode;
node = nodeNext;
}
};
int main()
{
ListNode t1(3);
ListNode t2(4);
ListNode t3(1);
t1.next = &t2;
t2.next = &t3;
ListNode *h = &t1;
while (h)
{
cout<<h->val<<" ";
h = h->next;
}
cout<<endl;
Solution solu;
h = &t1;
h = solu.insertionSortList(h);
while (h)
{
cout<<h->val<<" ";
h = h->next;
}
cout<<endl;
system("pause");
return 0;
}
可以由上面的一大坨代码简化成这样:
//2014-2-19 update
ListNode *insertionSortList(ListNode *head)
{
ListNode dummy(INT_MIN);//dummy.next = head;无需这句
while (head)
{
ListNode *p = &dummy;
for ( ;p->next && head->val >= p->next->val; p = p->next);
ListNode *t = head;
head = head->next;
t->next = p->next;
p->next = t;
}
return dummy.next;
}
分享到:
相关推荐
LeetCode题解(java语言实现).pdf
leetcode题解 算法和数据结构题目及解答
leetcode中文版 LeetCode-Solution-PPT 刷题过程中在 LeetCode 中文版提交的题解和动画 LeetCode 第 23 题:合并 K 个排序链表 题解地址: LeetCode 第 41 题:缺失的第一个正数 题解地址: LeetCode 第 60 题:第 k...
判断字符串是否为回文数,leetcode原题,使用多种方法
Leetcode题解.pdf 刷题合集 Leecode大部分题目及答案
leetcode卡 leetcode 50题题解
Leetcode 题解.pdf
leetcode1-240题中文题解,md格式,java版本 有题目有题解有代码 需要使用markdown打开
python python_leetcode面试题解之第37题解数独_python题解
leetcode 分类 Leetcode 分门别类的Leetcode题解
c++ c++_c++编程基础之leetcode题解第37题解数独
添加题解地址or题解语言到表格,能同步leetcode新题情况 blog_solution_template.py 为指定的题目提供blog题解页面的模板 题目难度变化 写了这个脚本偶然发现有的题目难度发生了调整(最早的数据是博主更新的...
LeetCode题解该仓库记录刷LeetCode的提交答案, 在锻炼自己的编程能力同时, 分享给也在刷题的小伙伴.本人的能力有限, 仅记录自己理解的和实现的解题方式.刷题不是为了找到答案, 而是为了找到方法.笔记参考资料集1. ...
leetcode题库 说明 记录LeetCode题解,日更 题解语言为Java CSDN: 欢迎大家指正(^▽^) 已解题目 按分类 按题号
leetcode题库 Leetcode_Java Leetcode题解_Java 使用Java语言编写的Leetcode题解(中文) 暂停/延缓更新声明 由于将主要精力转移到科研工作,因此此仓库暂停/延缓更新。
题解 In Java。 在线阅读: 介绍 世界上并没有完美的程序,但我们并不因此而沮丧,因为写程序本来就是一个不断追求完美的过程。 本地开发 & 阅读 本项目基于 vuepress 进行开发,以提供比 github mardown 更佳的阅读...
LeetCode, LintCode题解分析
leetcode 分类 leetcode 分类的leetcode题解
Leetcode最近在刷 LeetCode,自制一个python题解12.15:已经刷掉目前所有的easy题,不保证是最优解,但是一定可以AC。从medium题开始每一题附有思路
Leetcode思路、题解 编程能力仍需提高,希望量变到质变吧。 2019/04/24 每天完成2道题,但只更新一道,每天上传的都是自己需要复习的。认识到自己的能力欠缺至极,感慨他人精妙的解法,而自己却只能仰望。有所不甘,...