leetcode做题笔记147. 对链表进行插入排序

2023-09-21 19:25:51

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

插入排序 算法的步骤:

  1. 插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。
  2. 每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。
  3. 重复直到所有输入数据插入完为止。

下面是插入排序算法的一个图形示例。部分排序的列表(黑色)最初只包含列表中的第一个元素。每次迭代时,从输入数据中删除一个元素(红色),并就地插入已排序的列表中。

对链表进行插入排序。

思路一:模拟题意

c语言解法

struct ListNode *insertionSortList(struct ListNode *head) {
    if (head == NULL) {
        return head;
    }
    struct ListNode *dummyHead = malloc(sizeof(struct ListNode));
    dummyHead->val = 0;
    dummyHead->next = head;
    struct ListNode *lastSorted = head;
    struct ListNode *curr = head->next;
    while (curr != NULL) {
        if (lastSorted->val <= curr->val) {
            lastSorted = lastSorted->next;
        } else {
            struct ListNode *prev = dummyHead;
            while (prev->next->val <= curr->val) {
                prev = prev->next;
            }
            lastSorted->next = curr->next;
            curr->next = prev->next;
            prev->next = curr;
        }
        curr = lastSorted->next;
    }
    return dummyHead->next;
}

c++解法

class Solution {
public:
    ListNode* insertionSortList(ListNode* head) {
        ListNode* headnode = new ListNode(INT_MIN);
        ListNode* tail = headnode;
        ListNode* p = head;
        while (p) {
            auto tmp = p->next;
            ListNode* q = headnode;
            while (q->next && q->next->val < p->val) {
                q = q->next;
            }
            p->next = q->next;
            q->next = p;
            p = tmp;
        }
        return headnode->next;
    }
};

分析:

本题将链表通过插入排序,不断输入新节点将节点放到链表的正确位置,当最后的节点递归到应放的位置后插入,最后输出排序好的链表

总结:

本题考察对链表排序的操作,利用判断是否节点值大于现链表尾部值判断节点应放到哪个地方,最后返回链表即可解决

更多推荐

Spark_Spark内存模型管理

工作中经常用到Spark内存调参,之前还没对这块记录,这次记录一下。环境参数spark内存模型中会涉及到多个配置,这些配置由一些环境参数及其配置值有关,为防止后面理解混乱,现在这里列举出来,如果忘记了,可以返回来看看:spark.executor.memory:JVMOn-Heap内存(堆内内存),在使用sparksu

云服务器部署k8s集群

在两台不同厂商的云服务器上部署k8s集群,遇到一些问题。在此进行下总结。首先要网络能够互通,我是通过添加虚拟网卡的方式lsmod|grepip_vs#检查是否有开启#临时开启ip_vsforiin$(ls/lib/modules/$(uname-r)/kernel/net/netfilter/ipvs|grep-o"^

【Spark】PySpark DataFrame

1SparkSession执行环境入口2构建DataFrame2.1由rdd构建(StructType、StructField)2.2由pandas.DataFrame构建2.3由外部数据构建2.3.1text数据源2.3.2json数据源2.3.3csv数据源3DataFrame操作3.1SQL风格3.2DSL风格3

WebGL HUD(平视显示器)

目录HUD(平视显示器)如何实现HUD示例程序(HUD.html)示例程序(HUD.js)代码详解在网页文字上方显示三维物体代码详解HUD(平视显示器)平视显示器(headupdisplay)简称HUD,最早用于飞机驾驶。平视显示器将一些重要信息投射到飞机驾驶舱前方的一块玻璃上,飞行员能够将外界的影像和这些重要信息融合

使用vue-cli搭建SPA项目

目录一、SPA项目构建及目录讲解1.1SPA定义1.2SPA优点1.3VueCLI定义1.4VueCLI功能解析1.5安装vue-cli1.6创建SPA项目1.7项目结构说明1.8项目结构说明1.8.1build文件夹1.8.2config文件夹1.8.3node_modules文件夹1.8.4src文件夹1.8.5s

ctfshow web入门(2)

web11打开这个网站,到网站诊断分析模块搜索域名web12提示有时候网站上的公开信息,就是管理员常用密码打开,就是个购物网站因为昨天刚做robots.txt我就搜了一下真的有,提示admin这个页面访问一下,username肯定是admin,但是密码。有点晕。但是看到提示我就又去看了看原来的页面,有没有可疑的密码在末

MQTT服务器搭建

本次搭建的MQTT服务器是emqx提供的服务器1、下载https://www.emqx.com/en/downloads/broker从官网下载5.2.0版本emqx-5.2.0-windows-amd64.zip下载完成直接安装2、配置,修改端口号mqtt默认端口号常规的用法,我们一般使用和开放这两个端口:1883,

php生成随机验证码图片

1,CaptchaPicture.php用于生成画布,然后在画布上生成四位随机验证码<?phpsession_start();header("Content-type:image/png");//创建图像的格式$image_width=76;//设置图像的宽度$image_height=40;//设置图像的高度$len

线性代数与编程语言结合 基础

什么是线性代数线性代数是数学的一个分支,研究向量空间和线性变换的理论与方法。它涉及了向量、矩阵、线性方程组、线性映射等概念与运算规则。线性代数在科学和工程领域中被广泛应用,如物理学、计算机图形学、统计学、电子工程等。它提供了一种强大的工具和语言来描述和解决线性问题,比如矩阵求逆、解线性方程组、特征值和特征向量等。通过线

抖音矩阵系统源码:开发搭建

一、抖音矩阵系统源码开发概述抖音seo矩阵系统源码开发技术要求十分严格。首先,需要熟练掌握Python、Java等编程语言,具有扎实的算法基础。在此基础上,还需要具备深度学习、神经网络等相关技能,能够实现精准推荐和内容分析等功能。其次,抖音seo矩阵系统开发还需要专业的云计算技术支持,比如分布式计算、负载均衡等,以确保

智能配电房监控系统:实现配电智能化管理

智能配电房监控系统是一种基于现代信息技术,实现对配电房设备运行状态实时监控的智能化系统。它能够实时监测配电房设备的运行状态,及时发现设备故障,提高配电系统的可靠性,同时还可以实现远程监控和智能化控制,提高配电系统的效率。一、智能配电房监控系统的构成智能配电房监控系统主要由监控终端、通信网络和监控中心三部分构成。1.监控

热文推荐