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 (插入排序链表)的更多相关文章

  1. [LeetCode] 147. Insertion Sort List 链表插入排序

    Sort a linked list using insertion sort. A graphical example of insertion sort. The partial sorted l ...

  2. LeetCode 147. Insertion Sort List 链表插入排序 C++/Java

    Sort a linked list using insertion sort. A graphical example of insertion sort. The partial sorted l ...

  3. leetcode——Insertion Sort List 对链表进行插入排序(AC)

    Sort a linked list using insertion sort. class Solution { public: ListNode *insertionSortList(ListNo ...

  4. [Leetcode Week16]Insertion Sort List

    Insertion Sort List 题解 原创文章,拒绝转载 题目来源:https://leetcode.com/problems/insertion-sort-list/description/ ...

  5. leetcode 【 Insertion Sort List 】 python 实现

    题目: Sort a linked list using insertion sort. 代码:oj测试通过 Runtime: 860 ms # Definition for singly-linke ...

  6. 【leetcode】Insertion Sort List (middle)

    Sort a linked list using insertion sort. 思路: 用插入排序对链表排序.插入排序是指每次在一个排好序的链表中插入一个新的值. 注意:把排好序的部分和未排序的部分 ...

  7. leetcode:Insertion Sort List

    Sort a linked list using insertion sort. 分析:此题要求在链表上实现插入排序. 思路:插入排序是一种O(n^2)复杂度的算法,基本想法就是每次循环找到一个元素在 ...

  8. [LeetCode] 147. Insertion Sort List 解题思路

    Sort a linked list using insertion sort. 问题:实现单向链表的插入排序. 这是比较常规的一个算法题目. 从左往右扫列表,每次将指针的下一个元素插入前面已排好序的 ...

  9. leetcode 名单 Insertion Sort List

    Insertion Sort List Total Accepted: 24444 Total Submissions: 96639My Submissions Sort a linked list ...

  10. [LeetCode 题解]: Insertion Sort List

    Sort a linked list using insertion sort. 题目要求:链表的插入排序,由于没有时间复杂度的要求,可以直接循环操作. /** * Definition for si ...

随机推荐

  1. 一 创建github账号以及上传工程到github

    第一步:安装git. apt-get install git 第二步:配置用户名和密码: git config –global user.name “XXX” git config –global u ...

  2. mysql 时间处理函数

    (1)求两个时间戳之间相差的天数 SELECT TIMESTAMPDIFF(DAY,                                              FROM_UNIXTIM ...

  3. sga之library cache 内部原理

    一.概述 library cache(库缓存)是shared pool中的一块内存区域,它的主要作用是缓存刚刚执行过的sql语句和pl/sql(包括存储过程.包.函数.触发器)所对应的解析计划.解析树 ...

  4. 解决XAMPP不能启动Apche服务问题

    打开command prompt输入命令 netstat -ano 查看哪个 PID的进程占用了80端口.结果是inetinfo.exe 网上查了下,正是WIN XP IIS的进程,但是又不想删,就只 ...

  5. HDOJ 1238 Substrings 【最长公共子串】

    HDOJ 1238 Substrings [最长公共子串] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Ja ...

  6. linux命令(6/10):find 命令

    Linux将时钟分为系统时钟(System Clock)和硬件(Real Time Clock,简称RTC)时钟两种.系统时间是指当前Linux Kernel中的时钟, 而硬件时钟则是主板上由电池供电 ...

  7. Python3:Django根据models生成数据库表时报 __init__() missing 1 required positional argument: 'on_delete'

    Python3:Django根据models生成数据库表时报 __init__() missing 1 required positional argument: 'on_delete' 一.分析 在 ...

  8. Sybase:解锁

    Sybase:解锁 Sql代码: --查询锁表 sp_iqlocks --解除锁定 drop connection[连接序号]

  9. jQuery幻灯片播放器插件

    在线演示 本地下载

  10. python数据可视化(持续更新)

    1.折线图 import numpy as np import matplotlib.pyplot as plt input_values = [1, 2, 3, 4, 5] s = [1, 4, 9 ...