【CT】LeetCode手撕—148. 排序链表

news2024/11/25 4:51:27

目录

  • 题目
  • 1- 思路
  • 2- 实现
    • ⭐148. 排序链表——题解思路
  • 3- ACM 实现

题目

  • 原题连接:148. 排序链表

1- 思路

  • 排序链表,将每个元素看做一个单独的链表 ——> 归并排序 ——> 每次将单独的链表合并

2- 实现

⭐148. 排序链表——题解思路

在这里插入图片描述

class Solution {
    public ListNode sortList(ListNode head) {

        // 1. 先求链表长度
        int len = 0;
        ListNode forH = head;
        while(forH!=null){
            len++;
            forH = forH.next;
        }

        ListNode dummyHead = new ListNode(-1);
        dummyHead.next = head;

        // 2. 利用 for 拆分
        for(int subLen = 1 ; subLen < len;subLen*=2){
            ListNode prev = dummyHead, cur = dummyHead.next;
            while(cur!=null){
                
                // 子链1
                ListNode head1 = cur;
                for(int i = 1 ; i < subLen && cur.next !=null ; i++){
                    cur = cur.next;
                }

                // 子链2
                ListNode head2 = cur.next;
                cur.next = null;
                cur = head2;
                for(int i = 1 ; i < subLen && cur!=null && cur.next !=null ;i++){
                    cur = cur.next;
                }

                ListNode next = null;
                if(cur!=null){
                    next = cur.next;
                    cur.next = null;
                }
                ListNode merged = mergeList(head1,head2);
                prev.next = merged;
                while(prev.next!=null){
                    prev = prev.next;
                }
                cur = next;
            }
        }
        return dummyHead.next;
    }

    public ListNode mergeList(ListNode head1,ListNode head2){
        ListNode dummyHead = new ListNode(0);
        ListNode cur = dummyHead;
        ListNode forA = head1;
        ListNode forB = head2;
        while(forA!=null && forB !=null){
            if(forA.val < forB.val){
                cur.next = forA;
                forA = forA.next;
            }else{
                cur.next = forB;
                forB = forB.next;
            }
            cur = cur.next;
        }

        if(forA!=null){
            cur.next = forA;
        }else{
            cur.next = forB;
        }
        return dummyHead.next;
    }
}

3- ACM 实现

public class sortLink {

    static class ListNode{
        int val;
        ListNode next;
        ListNode(){}
        ListNode(int x){
            val = x;
        }
    }

    // 合并链表
    public static ListNode sortList(ListNode head){
        // 1. 求长度
        int len = 0;
        ListNode l = head;
        while (l!=null){
            len++;
            l = l.next;
        }

        ListNode dummyHead = new ListNode(-1);
        dummyHead.next = head;

        // 自底向上

        for(int subLen = 1 ; subLen < len;subLen*=2){
            ListNode prev = dummyHead,cur = dummyHead.next;
            while(cur!=null){
                ListNode head1 = cur;
                for(int i = 1; i < subLen && cur.next!=null; i++){
                    cur = cur.next;
                }

                ListNode head2 = cur.next;
                cur.next = null;
                cur = head2;
                for(int i = 1; i < subLen && cur!=null && cur.next!=null ; i++){
                    cur = cur.next;
                }

                // 记录next
                ListNode next = null;
                if(cur!=null){
                    next = cur.next;
                    cur.next = null;
                }

                ListNode merged = merged(head1,head2);
                prev.next = merged;
                while(prev.next!=null){
                    prev = prev.next;
                }
                cur = next;
            }

        }
        return dummyHead.next;
    }


    public static ListNode merged(ListNode head1, ListNode head2){
        ListNode dummyHead = new ListNode(-1);
        ListNode cur = dummyHead;
        while(head1!=null && head2 !=null){
            if(head1.val<head2.val){
                cur.next = head1;
                head1 = head1.next;
            }else{
                cur.next = head2;
                head2 = head2.next;
            }
            cur = cur.next;
        }
        if(head1!=null){
            cur.next = head1;
        }else{
            cur.next = head2;
        }
        return dummyHead.next;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("输入链长度");
        int n = sc.nextInt();

        System.out.println("输入链表元素");
        ListNode head=null,tail=null;
        for(int i = 0 ; i < n;i++){
            ListNode newNode = new ListNode(sc.nextInt());
            if(head==null){
                head = newNode;
                tail = newNode;
            }else{
                tail.next = newNode;
                tail = tail.next;
            }
        }

        ListNode res = sortList(head);
        System.out.println("排序后的链表是");
        while(res!=null){
            System.out.print(res.val +" ");
            res = res.next;
        }
    }
}

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

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

相关文章

成人高考本科何时报名-深职训学校帮您规划学习之路

你有想过继续深造自己的学历吗&#xff1f;也许你已经工作多年&#xff0c;但总觉得学历是一块心病&#xff0c;想要通过成人高考本科来提升自己。不用着急&#xff0c;今天我们来聊一聊成人高考本科的报名时间&#xff0c;以及深职训学校如何帮助你顺利完成报名。 深圳成人高…

若依前后端分离 前端路由登录页 如何进行跳转

路由守卫&#xff0c;看这篇文章 http://t.csdnimg.cn/HkypThttp://t.csdnimg.cn/HkypT

昇思25天学习打卡营第06天 | 网络构建

昇思25天学习打卡营第06天 | 网络构建 文章目录 昇思25天学习打卡营第06天 | 网络构建定义网络网络层模型预测 模型参数总结打卡 神经网络模型是由神经网络层和对Tensor的操作构成的。 在MindSpore&#xff0c; Cell类是网络的基本单元。一个神经网络模型表示为一个 Cell&…

线上问题定位分析宝典——Linux中定位JVM问题常用命令

查询Java进程ID #ps axu | grep java #ps elf | grep java查看机器负载及CPU信息 #top -p 1(进程ID) #top (查看所有进程)获取CPU飙升线程堆栈 1. top -c 找到CPU飙升进程ID&#xff1b; 2. top -Hbp 9702(替换成进程ID) 找到CPU飙升线程ID&#xff1b; 3. $ printf &quo…

14-20 Vision Transformer用AI的画笔描绘新世界

概述 毫无疑问,目前最受关注且不断发展的最重要的主题之一是使用人工智能生成图像、视频和文本。大型语言模型 (LLM) 已展示出其在文本生成方面的卓越能力。它们在文本生成方面的许多问题已得到解决。然而,LLM 面临的一个主要挑战是它们有时会产生幻觉反应。 最近推出的新模…

binutils ifunc 流程图

上图是x86 binutils 的流程图。 函数说明_bfd_x86_elf_link_hash_table_createInit local STT_GNU_IFUNC symbol hash.elf_x86_64_check_relocsAdd support for handling STT_GNU_IFUNC symbols_bfd_elf_x86_get_local_sym_hashFind and/or create a hash entry for local sym…

Map Set(Java篇详解)

&#x1f341; 个人主页&#xff1a;爱编程的Tom&#x1f4ab; 本篇博文收录专栏&#xff1a;Java专栏&#x1f449; 目前其它专栏&#xff1a;c系列小游戏 c语言系列--万物的开始_ 等 &#x1f389; 欢迎 &#x1f44d;点赞✍评论⭐收藏&#x1f496;三连支持…

麒麟操作系统开机显示initramfs问题解决方案

一、问题现象&#xff1a; 近期某客户开机提示以下内容&#xff1a; 二、原因分析&#xff1a; 出现该问题一般是在【强制关机】或者【电脑异常断电】的情况下概率性导致系统分区损坏&#xff0c;重启后大概率就会进入到initramfs 模式。 三、解决思路&#xff1a; 1、输入ex…

邮件营销:利用HubSpot实现自动化与高效增长

在当今数字化时代&#xff0c;电子邮件&#xff08;Email&#xff09;作为最古老也是最强大的数字营销工具之一&#xff0c;依然占据着不可替代的地位。它不仅是个人与企业间日常沟通的重要桥梁&#xff0c;更是企业实施精准营销、扩大品牌影响力、促进销售转化的关键手段。随着…

解决在【Tomcat服务器上报错java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver】

目录 1. 添加驱动依赖&#xff1a;右键导入为库 2. 重新导入工件&#xff0c;注意看lib下有没有mysql的驱动包&#xff0c;没有的话需要导入。 3. 写代码的时候要注意对null值的处理&#xff0c;比如下面的截图&#xff0c;如果只是简单的获取生成的随机数&#xff0c;很有可…

[数据结构] --- 线性数据结构(数组/链表/栈/队列)

1 线性结构和非线性结构的理解 1.1 线性结构 线性结构是什么&#xff1f; 数据结构中线性结构指的是数据元素之间存在着“一对一”的线性关系的数据结构。线性结构是一个有序数据元素的集合。 线性结构特点&#xff1a; 线性结构有唯一的首元素&#xff08;第一个元素&#…

openstack虚机重启无法启动或者云盘无法挂载问题(rbd的header元数据丢失问题)

这里写自定义目录标题 一、openstack虚机重启无法启动或者云盘无法挂载问题(rbd的header元数据丢失问题)1、openstack计算节点报错现象2、存储侧的rbd报错3、解决思路4、解决办法4.1 先看下正常的rbd的元数据信息4.2 查找丢失的header4.3 生成反编码属性4.3.1 features4.3.2 ob…

四大水刊《PLoS One》也升一区了!发文量依旧爆炸!

关注GZH【欧亚科睿学术】&#xff0c;第一时间获取期刊最新动态&#xff01; 最新JCR正式公布后&#xff0c;期刊PLOS ONE发文量继续保持在高位&#xff0c;还上升至JCR1区&#xff0c;简直赢麻了&#xff01; 作为四大“水刊”之一&#xff0c;期刊PLOS ONE创刊于2006年&…

docker 安装 禅道

docker pull hub.zentao.net/app/zentao:20.1.1 sudo docker network create --subnet172.172.172.0/24 zentaonet 使用 8087端口号访问 使用禅道mysql 映射到3307 sudo docker run \ --name zentao2 \ -p 8087:80 \ -p 3307:3306 \ --networkzentaonet \ --ip 172.172.172.…

科东软件精彩亮相华南工博会,展现未来工业前沿技术

近日&#xff0c;华南国际工业博览会在深圳成功举办。科东软件携众多前沿技术、解决方案及最新应用案例精彩亮相&#xff0c;为参展观众带来了一场工业智能的科技盛宴。 鸿道操作系统&#xff08;Intewell&#xff09; 科东软件重点展示了鸿道操作系统&#xff08;Intewell&…

Shenandoah GC概述

文章目录 1_介绍2_原理1.0版本2.0版本3_ShenandoahGC的执行流程4_并发转移阶段 – 并发问题 1_介绍 Shenandoah 是由Red Hat开发的一款低延迟的垃圾收集器&#xff0c;Shenandoah 并发执行大部分 GC 工作&#xff0c;包括并发的整理&#xff0c;堆大小对STW的时间基本没有影响…

day11_homework_need2submit

Homework 编写—个将ts或mp4中视频文件解码到yuv的程序 yuv数据可以使用如下命令播放: ffplay -i output yuv-pix_fmt yuv420p-s 1024x436 要求: ffmpeg解析到avpacket并打印出pts和dts字段完成解码到avframe并打印任意字段完成yuv数据保存 // teminal orders on bash cd ex…

Unity2D - 基本战斗系统(Battle System Design)

1. 攻击逻辑 在Entity中初始化两个变量&#xff0c;因为在每个角色几乎都拥有攻击状态。这两个变量分别是transform类&#xff0c;接收一个坐标和一个半径画一个圆作为攻击的判定范围 public Transform attackCheck; public float attackCheckRadius; 为了可视化攻击范围&am…

基于改进高斯-拉普拉斯滤波器的一维时间序列平滑与降噪(MATLAB)

以图像处理为例&#xff0c;拉普拉斯算子是基于图像的二阶导数来找到边缘并搜索过零点&#xff0c;传统的拉普拉斯算子常产生双像素宽的边缘&#xff0c;对于较暗区域中的亮斑进行边缘检测时&#xff0c;拉普拉斯运算就会使其变得更亮。因此&#xff0c;与梯度算子一样&#xf…

亚马逊跟卖选品erp采集,跟卖卖家的选品利器,提升选品效率!

今天给亚马逊跟卖卖家&#xff0c;分享我现在在用的两种选品方式&#xff0c;做个铺货或者是跟卖都可以&#xff0c;是不是很多卖家选品现在都是亚马逊前端页面或是新品榜单选择产品跟卖&#xff0c;这样找品这就相当于大海捞针&#xff0c;而且新品榜单的产品你能看到那其他卖…