力扣--对链表进行插入排序--147

news2024/11/24 11:45:54

 

该题是不带哨兵位的!!! 

目录

该题是不带哨兵位的!!! 

首先先进行带哨兵位的代码展示:

但是就提论题,力扣上的这道题,没有明确说明附带哨兵位,我们一律按照无哨兵位

 那么针对于这道题,我们需要用不带哨兵位的方法来写:

不带哨兵位:(也是于本题符合的写法)

其方法便是:自己制造哨兵位,然后再free,返回

针对这题,通过代码:


该题链接

147. 对链表进行插入排序 - 力扣(LeetCode)

我看了不少题解,有的是带哨兵位的来写,有的是不带哨兵位的来写,在这一篇文章中,两者都会进行介绍:

首先先展示c语言简单实现数组的插入排序:

void insertion_sort(int arr[], int len){
        int i,j,key;
        for (i=1;i<len;i++){
                key = arr[i];
                j=i-1;
                while((j>=0) && (arr[j]>key)) {
                        arr[j+1] = arr[j];
                        j--;
                }
                arr[j+1] = key;
        }
}

首先先进行带哨兵位的代码展示:

其实现方法就是将数组部分改为对应的链表

struct ListNode* insertionSortList(struct ListNode* head) {
    if (head == NULL || head->next == NULL) {
        return head; // 处理链表为空或只有一个节点的情况
    }
    struct ListNode* cur = head->next->next, * ptr = head->next;
    struct ListNode* tmp = head;
    struct ListNode* cur_prev = head;
    int k = 0;

    while (cur)
    {
        //ptr为cur前一个
        k = cur->val;
        cur_prev = head;
        while (cur_prev->next != cur)
        {
            cur_prev = cur_prev->next;
        }
        ptr = cur_prev;


        if (cur->val >= ptr->val)
        {
            ptr = ptr->next;
            cur = cur->next;
        }
        else
        {
            
            
            while ((k < ptr->val) && (ptr != head))
            {
                ptr->next->val = ptr->val;//arr[j+1] = arr[j];
                //j--
                //存放ptr前一个
                tmp = head;

                while (tmp->next != ptr)
                {
                    tmp = tmp->next;
                }
                ptr = tmp;//--完成

                ptr->next->val = k;
            }
            cur = cur->next;
        }
    }
    return head;
}

但是就提论题,力扣上的这道题,没有明确说明附带哨兵位,我们一律按照无哨兵位

所以这样写是不行的,但反过来,该题的测试用例也不能完全通过, 他会有一个这样的测试用例

 那么针对于这道题,我们需要用不带哨兵位的方法来写:

不带哨兵位:(也是于本题符合的写法)

我一开始也是完全仿照c语言数组实现插入排序的方法来的

其代码如下:

其方法便是:自己制造哨兵位,然后再free,返回

struct ListNode* insertionSortList(struct ListNode* head) {
    if (head == NULL || head->next == NULL) {
        return head; // 处理链表为空或只有一个节点的情况
    }
    struct ListNode* dummy = (struct ListNode*)malloc(sizeof(struct ListNode));
    dummy->next = head;
    struct ListNode* cur = dummy->next->next, * ptr = head;
    // struct ListNode* cur = head->next->next, * ptr = head->next;
    struct ListNode* tmp = head;
    struct ListNode* cur_prev = head;
    int k = 0;

    while (cur)
    {
        //ptr为cur前一个
        k = cur->val;
        cur_prev = head;
        while (cur_prev->next != cur)
        {
            cur_prev = cur_prev->next;
        }
        ptr = cur_prev;
        if (cur->val >= ptr->val)
        {
            ptr = ptr->next;
            cur = cur->next;
        }
        else
        {
            while ((k < ptr->val) && (ptr != dummy))
            {
                ptr->next->val = ptr->val;//arr[j+1] = arr[j];
                //j--
                //存放ptr前一个
                tmp = dummy;
                while (tmp->next != ptr)
                {
                    tmp = tmp->next;
                }
                ptr = tmp;//--完成
                ptr->next->val = k;
            }
            cur = cur->next;
        }
    }
    free(dummy);
    return head;
}

 再力扣上运行,可想而知,肯定是不行的,会有一个超出时间限制,有一个测试用例不通过;

那么就需要转换方法:

代码如下:

针对这题,通过代码:

struct ListNode* insertionSortList(struct ListNode* head) {
    if (head == NULL || head->next == NULL) {
        return head;
    }
    struct ListNode* sortedHead = head, * sortedTail = head;//尾
    head = head->next;
    //最后一个
    sortedTail->next = NULL;

    while (head) {
        struct ListNode* cur = head;
        // 移动head指针到下一个节点
        head = head->next;

        //给sortedHead换头,直到合适
        if (cur->val <= sortedHead->val)//头插,更换头
        {
            cur->next = sortedHead;
            sortedHead = cur;
        }
        //sorthead的next没改

        //不是头查
        //弹药挨个比较找到对应的位置
        else
        {
            struct ListNode* tmp = sortedHead;
            //找到了对应位置
            while ((tmp != sortedTail) && (tmp->next->val <= cur->val))
            {
                tmp = tmp->next;
            }
            cur->next = tmp->next;//等价于 sortedTail->next=NULL;
            tmp->next = cur;
            //但如果对应位置为尾节点
            //更新Tail
            if (tmp == sortedTail)
            {
                sortedTail = cur;
                //此时的tmp为最后一个的下一个  NULL
            }
        }
    }
    return sortedHead;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1559559.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

11-SpringSecurity:Session共享,菜鸟驿站java面试题

pom依赖 org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-security org.springframework.boot spring-boot-starter-data-redis org.springframework.session spring-session-data-redis org.projectlombok lombok …

1.java 安装

操作步骤 下载: https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html1 通过Xftp将下载下来的jdk上传到指定虚拟机上传到/usr目录下 2 通过Xshell连接到虚拟机&#xff0c;执行如下命令&#xff0c;解压文件&#xff1a; $ tar zxvf jdk-8u…

算法沉淀 —— 动态规划篇(简单多状态dp问题下)

算法沉淀 —— 动态规划篇&#xff08;简单多状态dp问题下&#xff09; 前言一、买卖股票的最佳时机含冷冻期二、买卖股票的最佳时机含手续费三、买卖股票的最佳时机 IV 前言 几乎所有的动态规划问题大致可分为以下5个步骤&#xff0c;后续所有问题分析都将基于此 1.、状态表示…

概率论经典题目-二维随机变量及分布--由概率密度求分布函数和概率

解答&#xff1a; 由概率密度函数求解分布函数的公式可知&#xff1a; 辅助图形加以确定积分上下限

LCX端口转发

LCX介绍 LCX是一款端口转发工具&#xff0c;分为Windows版和Linux版&#xff0c;Linux版本为PortMap。LCX有端口映射和端口转发两大功能&#xff0c;例如当目标的3389端口只对内开放而不对外开放时&#xff0c;可以使用端口映射将3389端口映射到目标的其他端口使用&#xff1b…

k8s1.28.8版本配置Alertmanager报警方式(邮件,企业微信)

文章目录 总结部署流程 Alertmanager 三大核心1. 分组告警2. 告警抑制3. 告警静默 报警过滤静默通知方案一&#xff1a;方案二&#xff1a; 抑制报警规则案例一 参考文档 自定义路由告警&#xff0c;分来自不同路由的告警&#xff0c;艾特不同的人员进行区分修改 alertmanager …

Spark-Scala语言实战(9)

之前的文章中&#xff0c;我们学习了如何在spark中使用RDD方法的flatMap,take,union。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵的点赞&#xff0c;谢谢。 Spark-Scala语言实战&am…

keepalived+LVS高可用部署

目录 一.两台设备&#xff08;2.130和2.133&#xff09;作为调度器&#xff0c;前主后备 1.部署keepalived 2.修改配置文件准备启动 3.配置keepalived的系统日志并启动 二.模拟调度器掉点和web服务进程丢失 1.调度器掉点 2.当类似于httpd这种网站服务掉点 三.以三种健康…

【A-008】基于SSH的员工信息管理系统(含论文)

员工信息管理系统主要功能如下&#xff1a; (1)员工方面&#xff1a; ①人事管理&#xff1a;能够看到自己的基本信息&#xff0c;对自己的合同进行下载&#xff0c;可以看公司的培训信息&#xff1b; ②招聘管理&#xff1a;查看企业的招聘信息&#xff0c;包括应聘者&#x…

基于SpringBoot和Vue的学生笔记共享平台的设计与实现

今天要和大家聊的是一款基于SpringBoot和Vue的学生笔记共享平台的设计与实现 &#xff01;&#xff01;&#xff01; 有需要的小伙伴可以通过文章末尾名片咨询我哦&#xff01;&#xff01;&#xff01; &#x1f495;&#x1f495;作者&#xff1a;李同学 &#x1f495;&…

【Qt】常用控件(输入类)

目录 一、Line Edit二、Text Edit三、ComBo四、DateTimeEdit五、Slider 一、Line Edit QLineEdit 用来表示单行输入框&#xff0c;可以输入一段文本&#xff0c;但是不能换行。 属性说明test输入框中的文本inputMask输入内容格式约束maxLength最大长度frame是否添加边框echoM…

AES加密解密算法

一&#xff0c;AES算法概述 AES属于分组加密&#xff0c;算法明文长度固定为128位&#xff08;单位是比特bit&#xff0c;1bit就是1位&#xff0c;128位等于16字节&#xff09; 而密钥长度可以是128、192、256位 当密钥为128位时&#xff0c;需要循环10轮完成加密&#xff0…

OpenEuler华为欧拉系统安装教程及联网配置

OpenEuler简介 openEuler是一款开源操作系统。当前openEuler内核源于Linux&#xff0c;支持鲲鹏及其它多种处理器&#xff0c;能够充分释放计算芯片的潜能&#xff0c;是由全球开源贡献者构建的高效、稳定、安全的开源操作系统&#xff0c;适用于数据库、大数据、云计算、人工智…

人脸检测项目 | 基于C++在英特尔+ARM-CPU上部署人脸检测算法_推理速度可达1000fps

项目应用场景 面向在英特尔ARM CPU 平台部署轻量级的人脸检测算法&#xff0c;要求人脸检测算法的速度是能够达到实时的的场景&#xff0c;项目采用 C 开发&#xff0c;支持跨平台移植到包括 Linux、Windows 等 项目效果&#xff1a; 项目细节 > 具体参见项目 README.md (1…

【LeetCode: 330. 按要求补齐数组 + 贪心 + 构造区间】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

linux进程退出之exit与_exit

linux进程退出之exit与_exit _exitexit流程清理函数atexit()函数&#xff1a;on_exit()函数&#xff1a; _exit /* Terminate program execution with the low-order 8 bits of STATUS. */ /** status参数定义了进程的终止状态&#xff0c;父进程可以通过wait&#xff08;&am…

使用open3d分离背景和物体点云

一、代码 方法简单介绍 RANSAC&#xff08;随机采样一致性&#xff09;是一种常用的分割算法&#xff0c;通常用于从点云中分割出最大的平面&#xff08;如地面、墙壁等&#xff09;。RANSAC速度相对较快&#xff0c;特别是当点云数据量不是很大时。在物体与背景之间存在明显…

蓝桥杯 本质上升序列

题目描述: 小蓝特别喜欢单调递增的事物。 在一个字符串中&#xff0c;如果取出若干个字符&#xff0c;将这些字符按照在字符串中的顺序排列后是单调递增的&#xff0c;则成为这个字符串中的一个单调递增子序列。 例如&#xff0c;在字符串 lanqiao 中&#xff0c;如果取出字符…

蓝桥杯省赛刷题——题目 2656:刷题统计

刷题统计OJ链接&#xff1a;蓝桥杯2022年第十三届省赛真题-刷题统计 - C语言网 (dotcpp.com) 题目描述 小明决定从下周一开始努力刷题准备蓝桥杯竞赛。他计划周一至周五每天做 a 道题目&#xff0c;周六和周日每天做 b 道题目。请你帮小明计算&#xff0c;按照计划他将在第几…

Segger Embedded Studio IDE使用体验——默认的Section和Linker的设置

Segger Embedded Studio IDE使用体验之一——默认的Section和Linker的设置 一、简介二、操作2.1 编译后代码分析2.1.1 符号浏览器2.1.2 读取elf文件和map文件 2.2 调试2.2.1 查看变量2.2.2 设置供电 2.3 运行环境设置2.3.1 编译器2.3.2 汇编器2.3.3 包含其他文件2.3.4 .bss和.d…