LeetCode题解-147 对链表进行插入排序 Medium

时间:2022-12-19 23:28:33

对链表进行插入排序。

LeetCode题解-147 对链表进行插入排序 Medium

插入排序的动画演示如上。从第一个元素开始,该链表可以被认为已经部分排序(用黑色表示)。

每次迭代时,从输入数据中移除一个元素(用红色表示),并原地将其插入到已排好序的链表中。

插入排序算法:

插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。

每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。

重复直到所有输入数据插入完为止。

解题思路:

插入排序

1、需要从左向右查找,直到找到一个节点的下一个节点值大于当前正在对比的值,例如当前的值为cur = 3 对于序列1 2 3 4 3,假设最后一个值是cur,需要从左到右直到找到4,将3的后继节点设置为4

2、因为4的后驱节点也是3,而且3的后继节点是4,形成了环,需要将节点4的后继节点更改为节点3的后集结点(在执行步骤1之前的)

LeetCode题解-147 对链表进行插入排序 Medium

示例 1:

输入: 4->2->1->3

输出: 1->2->3->4

示例 2:

输入: -1->5->3->4->0

输出: -1->0->3->4->5

/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode insertionSortList(ListNode head) {
if(head==null)
return null;
ListNode dummyHead = new ListNode(0);
dummyHead.next = head;
ListNode cur, suffix,pos=null;
int move = 0;
pos=head;
while( pos != null){ suffix = pos.next;
cur = dummyHead;
while( cur != suffix &&cur!=null&& cur.next.val < pos.val){
cur = cur.next;
}
ListNode tpos = pos;
pos.next = cur.next;
cur.next = pos;
while(pos.next!=null && pos.next != tpos){
pos = pos.next ;
}
pos.next = suffix;
pos = suffix;
move++;
}
return dummyHead.next;
}
}

LeetCode题解-147 对链表进行插入排序 Medium的更多相关文章

  1. LeetCode题解-147 对链表进行插入排序

    对链表进行插入排序. 插入排序的动画演示如上.从第一个元素开始,该链表可以被认为已经部分排序(用黑色表示). 每次迭代时,从输入数据中移除一个元素(用红色表示),并原地将其插入到已排好序的链表中. 插 ...

  2. Java实现 LeetCode 147 对链表进行插入排序

    147. 对链表进行插入排序 对链表进行插入排序. 插入排序的动画演示如上.从第一个元素开始,该链表可以被认为已经部分排序(用黑色表示). 每次迭代时,从输入数据中移除一个元素(用红色表示),并原地将 ...

  3. LeetCode 147&period; 对链表进行插入排序(Insertion Sort List)

    题目描述 对链表进行插入排序. 插入排序的动画演示如上.从第一个元素开始,该链表可以被认为已经部分排序(用黑色表示). 每次迭代时,从输入数据中移除一个元素(用红色表示),并原地将其插入到已排好序的链 ...

  4. 【LEETCODE】64、链表分类,medium&amp&semi;hard级别,题目:2,138,142,23

    package y2019.Algorithm.LinkedList.medium; import y2019.Algorithm.LinkedList.ListNode; /** * @Projec ...

  5. LeetCode 题解 &vert; 237&period; 删除链表中的节点

    题目描述: 请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点. 现有一个链表 -- head = [4,5,1,9],它可以表示为: 示例 1: 输入: hea ...

  6. &lbrack;LeetCode题解&rsqb;109&period; 有序链表转换二叉搜索树 &vert; 快慢指针 &plus; 递归

    题目描述 给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: 给定的有序链表: ...

  7. &lbrack;LeetCode题解&rsqb;141&period; 环形链表 &vert; 快慢指针

    题目描述 给定一个链表,判断链表中是否有环. 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的 ...

  8. &lbrack;LeetCode题解&rsqb;142&period; 环形链表 II &vert; 快慢指针

    解题思路 本题是在141. 环形链表基础上的拓展,如果存在环,要找出环的入口. 如何判断是否存在环,我们知道通过快慢指针,如果相遇就表示有环.那么如何找到入口呢? 如下图所示的链表: 当 fast 与 ...

  9. &lbrack;LeetCode题解&rsqb;19&period; 删除链表的倒数第N个节点 &vert; 双指针 &plus; 一次遍历

    解题思路 双指针:第一个指针先走 n 步,然后两个指针同时走. 这里要注意当链表长度<=n,要删除头节点. 代码 /** * Definition for singly-linked list. ...

随机推荐

  1. linux内核数据结构之kfifo

    1.前言 最近项目中用到一个环形缓冲区(ring buffer),代码是由linux内核的kfifo改过来的.缓冲区在文件系统中经常用到,通过缓冲区缓解cpu读写内存和读写磁盘的速度.例如一个进程A产 ...

  2. CentOs6&period;5下独立安装Nginx篇

    一.检查系统是否安装了Nginx [root@localhost local]# find -name nginx [root@localhost local]# (如果已经安装了nginx就卸载掉原 ...

  3. hud 1785 畅通工程

    #include<iostream> #include<stdio.h> #include<algorithm> #include<math.h> us ...

  4. js打开新窗口的两种方式

    1.超链接<a href="http://www.jb51.net" title="脚本之家">Welcome</a>等效于js代码wi ...

  5. Webpack 开发工具与模块热替换

    Webpack 开发工具与模块热替换 ​⚠️ 注意: 永远不要在生产环境中使用这些工具,永远不要. devtool 当 JavaScript 异常抛出时,你常会想知道这个错误发生在哪个文件的哪一行.然 ...

  6. flask 扩展之 -- flask-pagedown

    支持 Markdown 语法, 并添加 富文本文章的预览功能. 使用到的包列表: PageDown : 使用 JavaScript 实现的客户端 Markdown 到 HTML 的转换程序. Flas ...

  7. 初次使用Mybatis配置出现错误待解决

    数据库: create table STUDENT ( STUID NUMBER(9) not null, SNAME VARCHAR2(50) not null, SEX VARCHAR2(4), ...

  8. UML设计

    UML设计 1. UML的概念 Unified Modeling Language(UML)又称统一建模语言或标准建模语言,是一个支持模型化和软件系统开发的图形化语言.为软件开发的所有阶段提供模型化和 ...

  9. 螺旋矩阵 java实现(待消化)

    import java.util.Scanner; /** * @author:(LiberHome) * @date:Created in 2019/3/4 17:13 * @description ...

  10. Activity 重载方法 onStart和onResume、onPause和onStop的区别

    Activity 重载方法 onStart和onResume.onPause和onStop的区别 首先了解Activity的四种状态 Running状态:一个新的Activity启动入栈后,它在屏幕最 ...