Insertion Sort List(单链表插入排序)

来源:https://leetcode.com/problems/insertion-sort-list

Sort a linked list using insertion sort.

方法:

1. 使用一个preHead指向头节点,这样在将节点插入头节点前面时(即某个节点值比头节点小)不需要进行特殊处理

2. 从头节点开始遍历,如果当前节点的下一个节点的值比当前节点的值大,就从头开始遍历找到第一个比当前节点的下一个节点的值大的节点,并插入到它的前面,注意插入时需要同时处理节点移出位置和插入位置的指针。

时间复杂度,平均O(n^2),最好O(1),此时节点本身有序,最坏O(n^2)

空间复杂度,需要的辅助存储为O(1)

稳定性,稳定,值相同的元素在排序后相对顺序保持不变

 1 /**
 2  * Definition for singly-linked list.
 3  * public class ListNode {
 4  *     int val;
 5  *     ListNode next;
 6  *     ListNode(int x) { val = x; }
 7  * }
 8  */
 9 class Solution {
10     public ListNode insertionSortList(ListNode head) {
11         ListNode preHead = new ListNode(0);
12         ListNode next = null, node = null, tmpNode = null;
13         preHead.next = head;
14         while(head != null) {
15             next = head.next;
16             if(next != null && next.val < head.val) {
17                 node = preHead;
18                 while(node.next != null && node.next.val <= next.val) {
19                     node = node.next;
20                 }
21                 tmpNode = node.next;
22                 node.next = next;
23                 head.next = next.next;
24                 next.next = tmpNode;
25             } else {
26                 head = head.next;
27             }
28         }
29         return preHead.next;
30     }
31 }// 8 ms
时间: 2024-12-24 12:48:26

Insertion Sort List(单链表插入排序)的相关文章

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

Sort a linked list using insertion sort. class Solution { public: ListNode *insertionSortList(ListNode *head) { if(head == NULL || head->next == NULL) return head; ListNode *result; result->val = INT_MIN; result->next = NULL; ListNode *cur=head,*

【LeetCode-面试算法经典-Java实现】【147-Insertion Sort List(链表插入排序)】

[147-Insertion Sort List(链表插入排序)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 原题 Sort a linked list using insertion sort. 题目大意 对一个单链表表进行插入排序 解题思路 使用一个指针p指向未排好序的链表的第一个结点,在排序好的部分中找到找第一个大于等于q的前驱结点,将p对应的结点插入到正确位置,p重新指向未排好序的链表的第一个结点.直到链表完成排序好. 代码实现 结点类 算法实现类 publi

Sort List &amp;&amp; Insertion Sort List (链表排序总结)

Sort List Sort a linked list in O(n log n) time using constant space complexity. Have you been asked this question in an interview?                   Yes               说明:归并排序: 时间 O(nlogn),空间 O(1). 每次将链表一分为二, 然后再合并.快排(用两个指针) /** * Definition for sing

单链表插入排序

输入:一个无序的单链表的头结点 输出:一个有序的单链表的头结点(这里假设是升序排序) 分析: 1. 插入排序的基本思想:将一个节点插入到一个有序的序列中.对于链表而言,要依次从待排序的链表中取出一个节点插入到已经排好序的链表中,也就是说,在单链表插入排序的过程中,原链表会截断成两部分,一部分是原链表中已经排好序的节点,另一部分是原链表中未排序的节点,这样就需要在排序的过程中设置一个当前节点,指向原链表未排序部分的第一个节点. 注意单链表插入排序和数组插入排序的不同:数组插入排序是从排好序的部分的

【LeetCode】 sort list 单链表的归并排序

题目:Sort a linked list in O(n log n) time using constant space complexity. 思路:要求时间复杂度O(nlogn) 知识点:归并排序,链表找到中点的方法 存在的缺点:边界条件多考虑!!! /** * LeetCode Sort List Sort a linked list in O(n log n) time using constant space complexity. * 题目:将一个单链表进行排序,时间复杂度要求为o

单链表 插入排序

思想:把待排序的链表分为已经排序的链表,和剩余未排序的链表 例如:3->4->1->5->2->NULL 已经排序完毕的的链表:(从第一个数开始) 3->NULL 未排序完毕的链表:4->1->5->2                                    用p表示还未排序的剩余链表的首节点 例如:3->4->NULL                    ready 1->5->2->NULL 每次已经排

leetcode 链表 Insertion Sort List

Insertion Sort List Total Accepted: 24444 Total Submissions: 96639My Submissions Sort a linked list using insertion sort. 题意:用插入排序对一个链表排序 思路: 插入排序对当前元素在前面已经排好的元素中找到一个位置把它插入 可以设置一个指向头节点的dummy元素,统一操作 注:链表中的交换节点操作,不能简单地只交换节点里的value,因为value有可能是很复杂的类,那样要调

折半插入排序(binary insertion sort)

折半插入排序(binary insertion sort)是对插入排序算法的一种改进,所谓排序算法过程,就是不断的依次将元素插入前面已排好序的序列中. 折半插入排序(binary insertion sort)是对插入排序算法的一种改进,由于排序算法过程中,就是不断的依次将元素插入前面已排好序的序列中.由于前半部分为已排好序的数列,这样我们不用按顺序依次寻找插入点,可以采用折半查找的方法来加快寻找插入点的速度.

leetcode 之 Insertion Sort List

题目描述:  难度: 中等 Sort a linked list using insertion sort. 中文描述: 使用插入排序对一个链表进行排序. 解析: 插入排序就不多说了,主要看插入排序对于单链表来说怎么做. 在单链表中,由于无法拿到链表的前一个元素,所有每次遍历必须从head 开始.找到最后一个比当前待排序节点小的节点.  如 4 ->1 ->2 ->3   首先从cur = 4 开始, 判断cur.next 与cur 的大小, 并交换,得到 1->4->2-&