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. JAVA三框架工作原理是什么?

    一.struts的工作原理: 1.初始化,读取struts-config.xml.web.xml等配置文件(所有配置文件的初始化) 2.发送HTTP请求,客户端发送以.do结尾的请求 3.填充Form ...

  2. 在Docker上安装配置Oracle教程

    地址:https://github.com/wnameless/docker-oracle-xe-11g Docker shell 下: docker pull wnameless/oracle-xe ...

  3. Linux入门-教学视频学习笔记

    视频地址:https://www.bilibili.com/video/av18156598 1.sudo权限 比如说关机.重启.添加其他用户. 2.Shell是什么? 这是一个结构图,比如在外层应用 ...

  4. mysql第三天作业

    1.将所有的课程的名称以及对应的任课老师姓名打印出来,如下:SELECT cname,tname FROM course LEFT JOIN teacher ON teacher.tid=course ...

  5. PL/SQL编程—分页功能(存储过程)

    SQL),bookname ),publish )); Table created SQL> SQL> create or replace procedure sp_add_book(bo ...

  6. ZOJ 3261 Connections in Galaxy War (逆向+带权并查集)

    题意:有N个星球,每个星球有自己的武力值.星球之间有M条无向边,连通的两个点可以相互呼叫支援,前提是对方的武力值要大于自己.当武力值最大的伙伴有多个时,选择编号最小的.有Q次操作,destroy为切断 ...

  7. HTML5 SVG世界地图

    在线演示 本地下载

  8. Spring Boot 快速入门(Eclipse)

    步骤一:关于版本(前期工作) JDK 1.8 maven 3.5 配置环境变量: 步骤二:创建项目 首先新建个maven项目(SpringBoot 应用,本质上是一个Java 程序,其采用的风格是 m ...

  9. 并发-AtomicInteger源码分析—基于CAS的乐观锁实现

    AtomicInteger源码分析—基于CAS的乐观锁实现 参考: http://www.importnew.com/22078.html https://www.cnblogs.com/mantu/ ...

  10. Routing and Action Selection in ASP.NET Web API

    https://exceptionnotfound.net/using-http-methods-correctly-in-asp-net-web-api/ The algorithm ASP.NET ...