LeetCode OJ:Insertion Sort List (插入排序链表)
Sort a linked list using insertion sort.
用插入排序来排序一个list,额, 我写的好麻烦啊, debug了好久,至少提交了5次。。。写吐了快,先贴代码,写的也好乱啊:
class Solution {
public:
ListNode* insertionSortList(ListNode* hed) {
if (hed == NULL) return NULL;
head = hed;
ListNode * insertPosPrev;
ListNode * afterP;
ListNode * prev = head;
ListNode * p = head->next;
while (p != NULL) {
if (p->val > prev->val){
prev = p;
p = p->next;
continue;
}
insertPosPrev = findInsertPos(p);
if (insertPosPrev == NULL) {//插入头节点之前
afterP = p->next;
prev->next = afterP;
p->next = head;
head = p;
p = afterP;
continue;
}
else if (p != insertPosPrev->next) {
afterP = p->next;
prev->next = afterP;
p->next = insertPosPrev->next;
insertPosPrev->next = p;
p = afterP;
continue;
}
prev = p;
p = p->next;
}
return head;
} private:
ListNode * head; ListNode * findInsertPos(ListNode * end)
{
if (head->val >= end->val)
return NULL; //如果插入点在头节点那么返回NULL
ListNode * prev = head;
ListNode * p = prev->next;
while (p != end) {
if (prev->val < end->val && p->val >= end->val)
return prev;
prev = p;
p = p->next;
}
return prev;
}
};
这里贴一个大神的代码,有时间来看看,暂时还没看懂啊
class Solution
{
public:
ListNode *insertionSortList(ListNode *head)
{
if(head==NULL || head->next==NULL) return head;
ListNode *cur=head;
ListNode *helper=new ListNode();
ListNode *pre;
while(cur)
{
ListNode *next=cur->next;
pre=helper;
while(pre->next!=NULL && pre->next->val<cur->val)
{
pre=pre->next;
}
cur->next=pre->next;
pre->next=cur;
cur=next;
}
return helper->next;
} } ;
下面是java写的,第一遍写的基本上可以不看了,写的太麻烦了,下面这个写的稍微简单一点,代码如下:
public class Solution {
public ListNode insertionSortList(ListNode head) {
if(head == null) return null;
ListNode helper = new ListNode(Integer.MIN_VALUE);//将第一个节点的值设置成最小的
helper.next = head;
ListNode p = head.next;
ListNode pPre = head;
ListNode scan = helper;
while(p != null){
if(p.val >= pPre.val){
p= p.next;
pPre = pPre.next;
}else{
while(p.val > scan.next.val){
scan = scan.next;
}
if(p.val >= scan.val && p.val <= scan.next.val){
ListNode tmp = scan.next;
scan.next = p;
pPre.next = p.next;
p.next = tmp;
p = pPre.next;
scan = helper; // 将扫描节点重新放置到链表的前部
}
}
}
return helper.next;
}
}
LeetCode OJ:Insertion Sort List (插入排序链表)的更多相关文章
- [LeetCode] 147. Insertion Sort List 链表插入排序
Sort a linked list using insertion sort. A graphical example of insertion sort. The partial sorted l ...
- LeetCode 147. Insertion Sort List 链表插入排序 C++/Java
Sort a linked list using insertion sort. A graphical example of insertion sort. The partial sorted l ...
- leetcode——Insertion Sort List 对链表进行插入排序(AC)
Sort a linked list using insertion sort. class Solution { public: ListNode *insertionSortList(ListNo ...
- [Leetcode Week16]Insertion Sort List
Insertion Sort List 题解 原创文章,拒绝转载 题目来源:https://leetcode.com/problems/insertion-sort-list/description/ ...
- leetcode 【 Insertion Sort List 】 python 实现
题目: Sort a linked list using insertion sort. 代码:oj测试通过 Runtime: 860 ms # Definition for singly-linke ...
- 【leetcode】Insertion Sort List (middle)
Sort a linked list using insertion sort. 思路: 用插入排序对链表排序.插入排序是指每次在一个排好序的链表中插入一个新的值. 注意:把排好序的部分和未排序的部分 ...
- leetcode:Insertion Sort List
Sort a linked list using insertion sort. 分析:此题要求在链表上实现插入排序. 思路:插入排序是一种O(n^2)复杂度的算法,基本想法就是每次循环找到一个元素在 ...
- [LeetCode] 147. Insertion Sort List 解题思路
Sort a linked list using insertion sort. 问题:实现单向链表的插入排序. 这是比较常规的一个算法题目. 从左往右扫列表,每次将指针的下一个元素插入前面已排好序的 ...
- leetcode 名单 Insertion Sort List
Insertion Sort List Total Accepted: 24444 Total Submissions: 96639My Submissions Sort a linked list ...
- [LeetCode 题解]: Insertion Sort List
Sort a linked list using insertion sort. 题目要求:链表的插入排序,由于没有时间复杂度的要求,可以直接循环操作. /** * Definition for si ...
随机推荐
- fopen() r+、w+属性详解
r+具有读写属性,从文件头开始写,保留原文件中没有被覆盖的内容: w+具有读写属性,写的时候如果文件存在,会被清空,从头开始写. r 打开只读文件,该文件必须存在. r+ 打开可读写的文件,该文件必须 ...
- Pig、Hive、MapReduce 解决分组 Top K 问题(转)
问题: 有如下数据文件 city.txt (id, city, value) cat city.txt 1 wh 5002 bj 6003 wh 1004 sh 4005 wh 2006 bj 100 ...
- 如何实现关系表的级联删除(ON DELETE CASCADE的用法)
以下面两张表为例: SQL> desc person 名称 是否为空? 类型 --------------------- ...
- SSH 公钥检查
SSH 公钥检查是一个重要的安全机制,可以防范中间人劫持等黑客攻击.但是在特定情况下,严格的 SSH 公钥检查会破坏一些依赖 SSH 协议的自动化任务,就需要一种手段能够绕过 SSH 的公钥检查. 首 ...
- List集合的ForEach扩展
public static void ForEach<T>(this IEnumerable<T> enumerableSource, Action<T&g ...
- And Design:拓荒笔记——Upload上传
And Design:拓荒笔记——Upload上传 上传前
- React:快速上手(3)——列表渲染
React:快速上手(3)——列表渲染 使用map循环数组 了解一些ES6 ES6, 全称 ECMAScript 6.0 ,是 JaveScript 的下一个版本标准,2015.06 发版.ES6 主 ...
- python网络编程——IO多路复用之select
1 IO多路复用的概念 原生socket客户端在与服务端建立连接时,即服务端调用accept方法时是阻塞的,同时服务端和客户端在收发数据(调用recv.send.sendall)时也是阻塞的.原生so ...
- 参考MongoRepository,为接口生成bean实现注入
首先弄个注解,给代码个入口,这个就是mongo的@EnableMongoRepositories了. @Target(ElementType.TYPE) @Retention(RetentionPol ...
- Java 基础总结(二)
本文参见:http://www.cnblogs.com/dolphin0520/category/361055.html 1. 字节流与和字符流 1). 字符流操作时使用了缓冲区,而在关闭字符流时会强 ...