Leetcode-每日一题【147.对链表进行插入排序】

news2024/10/6 22:26:18

题目

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

插入排序 算法的步骤:

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

对链表进行插入排序。

示例 1:

 

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


示例 2:

 

输入: head = [-1,5,3,4,0]
输出: [-1,0,3,4,5]

提示:

  • 列表中的节点数在 [1, 5000]范围内
  • -5000 <= Node.val <= 5000

解题思路

前置知识

插入排序

步骤:

1.从第一个元素开始,该元素可以认为已经被排序
2.取下一个元素tem,从已排序的元素序列从后往前扫描
3.如果该元素大于tem,则将该元素移到下一位
4.重复步骤3,直到找到已排序元素中小于等于tem的元素
5.tem插入到该元素的后面,如果已排序所有元素都大于tem,则将tem插入到下标为0的位置
6.重复步骤2~5

图像演示如下:

 思路:

  在待排序的元素中,假设前n-1个元素已有序,现将第n个元素插入到前面已经排好的序列中,使得前n个元素有序。按照此法对所有元素进行插入,直到整个序列有序。
  但我们并不能确定待排元素中究竟哪一部分是有序的,所以我们一开始只能认为第一个元素是有序的,依次将其后面的元素插入到这个有序序列中来,直到整个序列有序为止。

插入排序代码实现:

package Sort;

import java.util.Arrays;

public class InsertSort {
    public static void main(String[] args) {
        int[] a = {49, 38, 65, 97, 76, 13, 27, 49};
        System.out.println("原始数组为" + Arrays.toString(a));
        insertSort(a);
        System.out.println("最终排序的结果为" + Arrays.toString(a));
    }

    public static void insertSort(int[] a) {
        for (int i = 1; i < a.length; i++) { //a[0]不用排序
            int temp = a[i]; //记录待排序元素的值
            for (int j = i - 1; j >= 0; j--) {
                if (temp < a[j]) {
                    a[j + 1] = a[j];
                } else {
                    break;
                }
                a[j] = temp;
            }
            System.out.println("第" + i + "轮排序的结果为" + Arrays.toString(a));
        }
    }
}

学习了插入排序的思想后让我们一起来看看这道题的解题思路 

 1.我们先设置一个虚拟头节点 dummy,令 dummy.next 指向我们要进行排序链表的 head 节点,设置 dummy 的原因是方便我们在链表的 head 节点前插入节点。

2.设置一个sorted节点,指向已经好序的最后一个节点(因为只有一个head节点,所以我们默认head节点是已经排好序的),再设置一个cur节点,用于指向待排序的节点(因为head 节点我们默认是已经排好序的,所以我们从head.next节点开始排序,令 cur 节点指向head.next)

3.我们开始遍历将要排序的链表,如果cur为空则说明链表已经遍历结束,若cur节点不为空,我们就比较sorted节点和cur节点的大小,若cur节点大于sorted,则我们不需要交换位置,直接让sorted向后走一位即可。若cur节点小于sorted节点,我们就需要设置一个prv节点去寻找cur指向的这个待排序节点应该存放的位置,我们找到一个小于等于cur的节点prv,它的后面就是我们cur节点应该存放的位置

4.我们将cur节点插入到prv后即可

代码实现

class Solution {
    public ListNode insertionSortList(ListNode head) {
        if(head == null){
            return head;
        }
        ListNode dummy = new ListNode(0);
        dummy.next = head;
        //sorted指向已排序的最后一个节点
        ListNode sorted = head;
        //cur指向待排序的节点
        ListNode cur = head.next;
        while(cur != null){
            if(sorted.val <= cur.val){
                sorted = sorted.next;
            }else{
                // prv指向待插入位置的前一个节点
                ListNode prv = dummy;
                while(prv.next.val <= cur.val){
                    prv = prv.next;
                }
                sorted.next = cur.next;
                cur.next = prv.next;
                prv.next = cur;
            }
            cur = sorted.next;
        }
        return dummy.next;

    }
}

测试结果

 

 

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

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

相关文章

MySQL分区表详解

目录 分区表介绍 分区适用场景 分区方式 分区策略 常见分区命令 1. 分区表介绍 MySQL 数据库中的数据是以文件的形势存在磁盘上的&#xff0c;默认放在 /var/lib/mysql/ 目录下面&#xff0c;我们可以通过 show variables like %datadir%; 命令来查看&#xff1a; 我们进入…

a标签form表单,转发,重定向

a标签需要写项目名,form表单需要写项目名,转发写请求路径,重定向需要写项目名 // window.location.href"请求路径" 需要写项目名 // window.location"请求路径" 需要写项目名 // document.location.href"请求路径" 需要写项目名 …

业务流程图怎么画?这几种绘制方法看一看

业务流程图怎么画&#xff1f;流程图提供了对业务流程的清晰概述&#xff0c;帮助人们理解工作流程中涉及的活动、决策和步骤。它定义了任务的顺序和依赖关系&#xff0c;使人们能够更好地了解整个流程。通过绘制流程图&#xff0c;可以更容易地识别出潜在的问题、瓶颈和延迟。…

SOPC之NiosⅡ系统(一)

1. 基础概念 1.1 CPU软核与硬核 简单来说 CPU硬核就是在FPGA上的一颗硬件结构固定并且用户不能对其结构进行任何更改、只能进行编程控制的芯片。 CPU软核则是FPGA上本来不存在这样的硬件结构&#xff0c;用户可根据硬件描述语言利用NIOS Ⅱ软核搭建出一个CPU。 1.2 SOC和S…

面试题大杂烩-记不住

1、分库分表图啥 分库是为了解决单库io连接数的瓶颈 分表是为了解决单表效率瓶颈 2、分表后如何limit分页 如果是根据xxx字段进行分表的话 那么shardingjdbc会根据字段进行笛卡尔积计算 去对应表里面执行sql到内存中计算&#xff0c;比如根据用户id进行hash算法进行查表&…

如何选择软文发布平台?软文发布平台的分类、特点及推广策略

在现今的市场竞争中&#xff0c;软文作为一种重要的推广方式&#xff0c;受到了越来越多企业的关注和运用。而软文发布平台&#xff0c;则是软文营销过程中不可或缺的一个环节&#xff0c;不同的软文发布平台会对软文的传播效果产生重要影响。本文将从软文发布平台的分类、特点…

淘宝APP商品详情源数据接口代码分享(API接口系列可高并发)

电商平台APP商品详情源数据接口代码分享如下&#xff1a; 商品数据&#xff1a;淘宝提供了商品的基本信息&#xff0c;包括商品名称、描述、规格、价格、销量、库存等信息。此外&#xff0c;也可以通过淘宝提供的API接口来获取商品的图片、评价、物流信息等详细数据。 公共参数…

深入理解DRF中的Mixin类

DRF官网地址&#xff1a; Home - Django REST framework Generic views - Django REST framework 一、Mixin类介绍 1.1 Mixin类介绍 Mixin类是一种常见的设计模式&#xff0c;在多个类之间共享功能或行为时非常有用。 一个Mixin类通常包含一组方法或属性&#xff0c;可以被…

unity 使用vrtk4的插件 打包htv vive VR客户端包,手柄不生效

背景&#xff1a; 目的&#xff1a;u3d使用vrtk开发pico应用(vrtk是为了到时候无缝衔接后续要买的htc vive pro 2) 先导入了tilia importer&#xff08;也就是vrtk4.0&#xff0c;根据教程模块化使用功能&#xff09;和pico官网下的“PICO Unity IntegrationSDK-214-20230302…

Leetcode-每日一题【138.复制带随机指针的链表】

题目 给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机指针 random &#xff0c;该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成&#xff0c;其中每个新节点的值都设为其对应的原节点的值。新节…

手捏Java知识点

今天开始面向对象了 面向对象基础 类&#xff1a;由属性和行为组成属性&#xff1a;在类中通过成员变量来体现行为&#xff1a;在类中通过成员方法来体现public class 类名{//成员变量变量1的数据类型 变量1;变量2的数据类型 变量2;...//成员方法方法1;方法2;...}有几个重要的概…

百度iOS端长连接组件建设及应用实践

作者 | 百度消息中台团队 导读 在过去的十年里&#xff0c;移动端技术飞速发展&#xff0c;移动应用逐渐成为主要的便捷访问和使用互联网的方式&#xff0c;承接了越来越多的业务和功能&#xff0c;这也意味着对移动端和服务器之间的通信效率和稳定性提出了更高的要求。为了实现…

ellisys 过滤设备

1、通过关键字过滤 输入蓝牙名称关键字&#xff0c;比如下面输入的是BNCM Transmitter "*BNCM*" || Receiver "*BNCM*" 之后&#xff0c;所有与这个设备相关的信号都会抓取过滤出来 2、通过地址过滤 之后&#xff0c;所有与这个设备相关的信号都会抓取过…

港联证券-深夜,大利好!人民币暴拉超500点,全球股市大反攻

全球商场一夜狂欢。 美国通胀大降温&#xff0c;全球危险资产全线大涨。北京时间7月12日晚间&#xff0c;美国劳工统计局发布数据&#xff0c;美国6月CPI同比涨幅回落至3%&#xff0c;低于预期3.1%&#xff0c;接连第12个月下降&#xff0c;且为2021年3月以来最低。数据发布后&…

02 |「Android Studio 新建项目」

前言 新手入门安卓开发 文章目录 前言一、步骤一、步骤 New Project选择 Empty Activity1)Name:项目的名字; 2)Package name:项目的包名(项目的唯一标识); 3)Save location:项目的保存路径; 4)Language:

QT实现按钮开关Form窗体的效果

实现效果叙述如下&#xff1a; MainWindow中的按钮实现Form窗体的开关&#xff0c;Form窗体的关闭按钮禁用掉&#xff0c;只允许使用窗体按钮进行&#xff0c;且关闭MainWindow按钮时Form窗体随之关闭。 注意&#xff1a; 要想实现关闭MainWindow按钮时Form窗体随之关闭&#x…

【Android知识笔记】系统进程(一)

Android 系统进程有哪些 先来一个整体结构图从宏观上理解Android系统的进程结构布局: 这里我们简单总结一下: 系统的第一个进程其实是0号进程(又叫swapper进程/Idle进程) 0号进程fork出了1号进程(init进程)和2号进程(kthreadd进程) 1号进程是所有普通用户进程的祖先,2号进程…

Docker部署前后端分离项目

✅作者简介&#xff1a;大家好&#xff0c;我是Cisyam&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Cisyam-Shark的博客 &#x1f49e;当前专栏&#xff1a; 项目部署 ✨特色专栏&…

K8s生产环境常见问题处理、答疑(连载、不定期更新)

文章目录 K8s 常见问题处理、答疑[1] calico一直处于未就绪状态[2] 删除dashboard 一直卡在delete[3] k8s-dashboard 修改tocken-ttl避免频繁输入tocken[4] kubectl 快捷指令[5] 解决UTC时间问题[6] kubectl命令自动补全[7] kubectl exec进入pod[8] 使用hostpath解决容器UTC时间…

LibreOffice 在win11(高版本win10)无响应的解决方案

问题描述 某次windows升级了以后&#xff0c;LibreOffice无法启动无响应、无报错 解决 安全模式启动 然后禁用显卡加速 然后&#xff1a;应用更改并重新启动 即可以正常模式启动LibreOffice