leetcode 147. 对链表进行插入排序

这篇具有很好参考价值的文章主要介绍了leetcode 147. 对链表进行插入排序。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

题目链接:leetcode 147

1.题目

给定单个链表的头 head ,使用 插入排序 对链表进行排序,并返回 排序后链表的头 。

插入排序 算法的步骤:

插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。
每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。
重复直到所有输入数据插入完为止。
下面是插入排序算法的一个图形示例。部分排序的列表(黑色)最初只包含列表中的第一个元素。每次迭代时,从输入数据中删除一个元素(红色),并就地插入已排序的列表中。

2.示例

1)示例 1:
输入: head = [4,2,1,3]
输出: [1,2,3,4]

2)示例 2:
输入: head = [-1,5,3,4,0]
输出: [-1,0,3,4,5]

3)提示:
列表中的节点数在 [1, 5000]范围内
-5000 <= Node.val <= 5000

3.分析

总结来说就是一道在链表上操作的插入排序,需要特判空指针的情况文章来源地址https://www.toymoban.com/news/detail-498539.html

4.代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    int n=0;
    vector<ListNode*> VL;
    map<ListNode*,ListNode*> last1;
    void get_n(ListNode* head){
        ListNode* cur=head,*last=NULL;
        while(cur!=NULL){
            last1[cur]=last;
            last=cur;
            VL.push_back(cur);
            cur=cur->next;
            n++;
        }
        return;
    }
    void get_next(ListNode* n1,ListNode* n2){
        if(n2!=NULL) last1[n2]=n1;
        if(n1!=NULL) n1->next=n2;
    }
    void get_insert(ListNode* node1,ListNode* node2){
        get_next(last1[node1],node1->next);
        get_next(last1[node2],node1);
        get_next(node1,node2);
        
    }
    ListNode* make_insert(ListNode* head){
        for(int i=0;i<n;i++){
            ListNode* cur=head;
            while(cur!=NULL){
                if(cur->val>VL[i]->val){
                    if(cur==head) head=VL[i];
                    get_insert(VL[i],cur);
                    break;
                } 
                cur=cur->next;
            }
        }
        return head;
    }
    ListNode* insertionSortList(ListNode* head) {
        get_n(head);
        return make_insert(head);
    }
};

到了这里,关于leetcode 147. 对链表进行插入排序的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 多种方法解决leetcode经典题目-LCR 155. 将二叉搜索树转化为排序的双向链表, 同时弄透引用变更带来的bug

    这段代码实际上是一个常见的算法题目的解法,目标是将一个二叉搜索树转换为一个排序的双向链表。整个过程是通过中序遍历来实现的,遍历过程中修改节点的左右指针来构建双向链表。代码中使用了一个额外的节点 dummy 来帮助构建双向链表,并使用 pre 节点来保存前一个

    2024年02月06日
    浏览(33)
  • 蓝桥杯宝藏排序题目算法(冒泡、选择、插入)

    从左往右找到最小的元素,放在起始位置;重复上述步骤,依次找到第2小、第3小元素... 第0次循环从[0,n-1]中找最小元素a[x],与a[0]交换 第1次循环从[1,n-1]中找最小元素,与a[1]交换 第2次循环从[2,n-1]中找最小元素,与a[2]交换 第i次循环从[i,n-1]中找最小元素,与a[i]交换 第n-2次循

    2024年01月17日
    浏览(30)
  • 关于链表的题目—leetcode

    问题描述: 给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。 返回删除后的链表的头节点。 示例 1: 输入: head = [4,5,1,9], val = 5 输出: [4,1,9] 解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 - 1 - 9. 示例 2: 输入

    2023年04月25日
    浏览(26)
  • 代码随想录额外题目| 数组03 ●34排序数组查首尾位置 ●922按奇偶排序数组II●35搜索插入位置

    #34排序数组查首尾位置 medium,我写的:1 暴力 我写的,做了个类似二分搜索的方法: 随想录:从两头都做类似二分搜索 #922 按奇偶排序数组II 我的解法,有点蠢: inplace解法: 把odd idx放的偶数,给换到even idx放的奇数 注意j是从1开始,而且每轮i,j都是继续增加不回去 空间表

    2024年02月15日
    浏览(32)
  • 【LeetCode题目详解】 203. 移除链表元素707. 设计链表206. 反转链表 day3(补)

    题意:删除链表中等于给定值 val 的所有节点。 示例 1: 输入:head = [1,2,6,3,4,5,6], val = 6 输出:[1,2,3,4,5] 示例 2: 输入:head = [], val = 1 输出:[] 示例 3: 输入:head = [7,7,7,7], val = 7 输出:[] 看到这道题就想到了链表 这道题有两种写法,涉及如下链表操作的两种方式: 直接使用

    2024年02月16日
    浏览(31)
  • 【leetcode100-033】【链表】排序链表

    【题干】 给你链表的头结点  head  ,请将其按  升序  排列并返回  排序后的链表  。 【思路】 递归版归并法链表版~没什么特别好说的(非递归版归并也是可以哒,但是马上要考试了今天懒得写了!打个flag在这里也许哪天想起来会补写一下) 首先是分割,这一步在链表

    2024年01月24日
    浏览(33)
  • 快排&超详细,Leetcode排序数组题目带你升华掌握

    大家好,这里是Dark FalmeMater。 这篇文章我将超级仔细地讲解快速排序,快排之所以叫快排,到底有多快,为什么这么快,还有快速排序的优化和改进,通过这篇文章你一定会对快排有进一步的掌握。 快排的历史及介绍 快速排序由C. A. R. Hoare在1962年提出。 它的基本思想是:通

    2024年02月08日
    浏览(44)
  • leetcode:排序链表(递归)

    给定链表的头结点  head  ,请将其按  升序  排列并返回  排序后的链表  。 示例 1: 示例 2: 示例 3: 提示: 链表中节点的数目在范围  [0, 5 * 104]  内 -105 = Node.val = 105

    2024年01月25日
    浏览(22)
  • 用C语言进行学生成绩排序(插入排序算法)

    从今天开始我们就要开始学习排序算法啦! 排序,就是重新排列表中的元素,使表中的元素满足按有序的过程。为了查找方便,通常希望计算机中的表是按有序的。 除了我们之前了解的时间复杂度和空间复杂度来判断一个算法的好坏之外,在排序算法这里我们引

    2024年02月15日
    浏览(29)
  • 【leetcode合集】如何知道自己是否掌握了数组与链表?试试这几道题目吧!

      目录 1.数组题目合集 1.1 leetcode.27 移除元素 1.2 leetcode.26 删除有序数组中的重复项 1.3 leetcode.88 合并两个有数数组 2.链表题目合集 2.1 leetcode.203 移除链表元素 2.2 leetcode.206 反转链表 2.3 leetcode.876 链表的中间结点 2.4 牛客 链表中倒数第k个结点 2.5 leetcode.21 合并两个有序链表 2.

    2024年01月25日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包