排序链表--字节跳动

少年的书桌上没有虚度的光阴

题目描述

请你对链表进行排序

思路分析

  • 核心思想:归并排序

有三个部分

链表排序实现

1. merge 函数

21.见 合并两个有序链表,

  • 首先创建一个虚拟头节点 newhead,并使用指针 tail 来构建合并后的链表。

  • 通过循环比较 list1list2 节点的值,将较小值的节点连接到 tail 后面,并相应地移动指针。

  • 当其中一个链表遍历完后,将另一个链表的剩余部分直接连接到 tail 后面。

  • 最后返回虚拟头节点的下一个节点,即合并后链表的头节点。

2. findMiddle 函数

该函数用于寻找链表的中间节点,采用快慢指针的方法:

  • fast 指针每次移动两步,slow 指针每次移动一步。

  • fast 指针到达链表末尾时,slow 指针就指向链表的中间节点。

3. sortList 函数

这是核心的排序函数,使用归并排序算法对链表进行排序:

  • 首先判断链表是否为空或只有一个节点,如果是则直接返回该链表。

  • 调用 findMiddle 函数找到链表的中间节点,将链表分成左右两部分。

  • 递归地对左右两部分链表分别调用 sortList 函数进行排序。

  • 最后调用 merge 函数将两个有序的子链表合并成一个有序链表。

完整代码

class Solution {
public:
    // 合并两个有序链表
    ListNode* merge(ListNode* list1, ListNode* list2) {
        auto  newhead = new ListNode(0); // 使用明确的类型名称
        auto  tail = newhead;

        while (list1 && list2) {
            if (list1->val < list2->val) {
                tail->next = list1;
                list1 = list1->next;
            } else {
                tail->next = list2;
                list2 = list2->next;
            }
            tail = tail->next;
        }

        tail->next = list1 ? list1 : list2; // 处理剩余部分
        return newhead->next;
    }

    // 寻找中间节点
    ListNode* findMiddle(ListNode* head) {
        ListNode* fast = head;
        ListNode* slow = head;

        while (fast->next && fast->next->next) {
            fast = fast->next->next;
            slow = slow->next;
        }

        return slow;
    }

    // 归并排序链表
    ListNode* sortList(ListNode* head) {
        if (head==NULL ||head->next==NULL) 
                return head; // 检查链表长度

        // 找到链表的中间节点
        ListNode* mid = findMiddle(head);
        ListNode* right = mid->next;
        mid->next = nullptr; // 切分链表

        // 递归地对左右两部分进行排序
        ListNode* l = sortList(head);
        ListNode* r = sortList(right);

        // 合并两个有序链表
        return merge(l, r);
    }
}
};

复杂度分析

  • 时间复杂度: O(nlogn)

  • 空间复杂度: O(logn)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

deepseek自动化代码生成

使用流程 效果第一步&#xff1a;注册生成各种大模型的API第二步&#xff1a;注册成功后生成API第三步&#xff1a;下载vscode在vscode中下载agent&#xff0c;这里推荐使用cline 第四步&#xff1a;安装完成后&#xff0c;设置模型信息第一步选择API provider&#xff1a; Ope…

Scrapy:Downloader下载器设计详解

Scrapy下载器设计详解 1. 整体架构 Scrapy的下载器(Downloader)是整个爬虫框架的核心组件之一&#xff0c;负责处理所有网络请求的下载工作。它的主要职责是&#xff1a; 管理并发请求实现请求调度处理下载延迟维护下载槽(Slot) 官方文档&#xff1a;Settings中的Downloader配…

【IO】java IO流的类型及IO模型

文章目录 分类字节流输入流输出流 字符流输入流输出流 字节缓冲流字符缓冲流4中常见的IO模型BIO&#xff08;同步阻塞模型&#xff09;同步非阻塞模型NIO&#xff08;多路复用模型&#xff09;AIO异步 分类 根据数据流向分为&#xff1a;输入流、输出流&#xff08;以内存为中…

计算机视觉:主流数据集整理

第一章&#xff1a;计算机视觉中图像的基础认知 第二章&#xff1a;计算机视觉&#xff1a;卷积神经网络(CNN)基本概念(一) 第三章&#xff1a;计算机视觉&#xff1a;卷积神经网络(CNN)基本概念(二) 第四章&#xff1a;搭建一个经典的LeNet5神经网络(附代码) 第五章&#xff1…

八股文实战之JUC:静态方法的锁和普通方法的锁

1、对于staic同步方法锁住的是class类模板&#xff08;Class对象&#xff09; 对象是线程&#xff08;调用者&#xff09; 调用者只有获取资源的锁才能调用 2、普通同步方法 锁住的资源是class对象 对象是线程&#xff08;调用者&#xff09;即&#xff1a; 静态同步方法&a…

EasyRTC:基于WebRTC与P2P技术,开启智能硬件音视频交互的全新时代

在数字化浪潮的席卷下&#xff0c;智能硬件已成为我们日常生活的重要组成部分&#xff0c;从智能家居到智能穿戴&#xff0c;从工业物联网到远程协作&#xff0c;设备间的互联互通已成为不可或缺的趋势。然而&#xff0c;高效、低延迟且稳定的音视频交互一直是智能硬件领域亟待…

VSCode - VSCode 切换自动换行

VSCode 自动换行 1、基本介绍 在 VSCode 中&#xff0c;启用自动换行可以让长行代码自动折行显示&#xff0c;避免水平滚动条频繁使用&#xff0c;提升代码阅读体验 如果禁用自动换行&#xff0c;长行代码就需要手动结合水平滚动条来阅读 2、演示 启用自动换行 禁用自动换…

编程小白冲Kaggle每日打卡(12)--kaggle学堂:<机器学习简介>模型如何工作

Kaggle官方课程链接&#xff1a;How Models Work 本专栏旨在Kaggle官方课程的汉化&#xff0c;让大家更方便地看懂。 How Models Work 第一步&#xff0c;如果你是机器学习的新手。 Introduction 我们将从概述机器学习模型的工作原理和使用方法开始。如果你以前做过统计建模…

IDEA安装deepseek最新教程2025

IDEA引入DeepSeek 将 IntelliJ IDEA&#xff08;JetBrains 开发的 Java 集成开发环境&#xff09;与 DeepSeek&#xff08;深度求索的技术能力&#xff09;结合&#xff0c;通常涉及利用 AI 技术增强开发效率或扩展 IDE 功能,安装完成后&#xff0c;结合 IntelliJ IDEA 的开发…

安科瑞能源物联网平台助力企业实现绿色低碳转型

安科瑞顾强 随着全球能源结构的转型和“双碳”目标的推进&#xff0c;能源管理正朝着智能化、数字化的方向快速发展。安科瑞电气股份有限公司推出的微电网智慧能源管理平台&#xff08;EMS 3.0&#xff09;&#xff0c;正是这一趋势下的创新解决方案。该平台集成了物联网&…

Ansible 学习笔记

这里写自定义目录标题 基本架构文件结构安装查看版本 Ansible 配置相关文件主机清单写法 基本架构 Ansible 是基于Python实现的&#xff0c;默认使用22端口&#xff0c; 文件结构 安装 查看用什么语言写的用一下命令 查看版本 Ansible 配置相关文件 主机清单写法

android,flutter 混合开发,pigeon通信,传参

文章目录 app效果native和flutter通信的基础知识1. 编解码器 一致性和完整性&#xff0c;安全性&#xff0c;性能优化2. android代码3. dart代码 1. 创建flutter_module2.修改 Android 项目的 settings.gradle&#xff0c;添加 Flutter module3. 在 Android app 的 build.gradl…

怎么在Github上readme文件里面怎么插入图片?

环境&#xff1a; Github 问题描述&#xff1a; 怎么在Github上readme文件里面怎么插入图片&#xff1f; https://github.com/latiaoge/AI-Sphere-Butler/tree/master 解决方案&#xff1a; 1.相对路径引用 上传图片到仓库 将图片文件&#xff08;如 .png/.jpg&#xff…

论文略读:Uncovering Hidden Representations in Language Models

202502 arxiv 说一下主要结论吧 对于下游任务&#xff0c;语言模型的中间层在所有架构和任务中始终优于最后一层 这挑战了使用最后一层表示的传统观点。 不同的架构表现出不同的信息压缩模式。自回归模型在中间层存在瓶颈&#xff0c;而双向模型则保持更均匀的趋势 BERT通过双…

0基础学Linux系统(准备1)

知识拓展 首先了解一下操作系统的作用与常见的操作系统。 我们身边常见的操作系统是windows,MACOS&#xff0c;Linux等&#xff0c;手机的操作系统有iOS&#xff0c;安卓等。 这里要学的就是Linux操作系统。 一个可用的计算机&#xff0c;可以说是由硬件和软件一起组成的&a…

在VS中如何将控制台(console)项目改为窗口(window)项目

1. 修改属性&#xff1a; 2. 修改main函数 int WINAPI WinMain(_In_ HINSTANCE hInstance,_In_opt_ HINSTANCE hPrevInstance,_In_ LPSTR lpCmdLine,_In_ int nShowCmd) //int main()

区块链共识机制详解

区块链共识机制详解 &#x1f91d; 1. 什么是共识机制&#xff1f; 共识机制是区块链网络中&#xff0c;所有节点就某个状态&#xff08;如交易的有效性&#xff09;达成一致的规则和过程。它解决了在去中心化网络中如何确保数据一致性的问题。 2. 主流共识机制 2.1 工作量证…

【项目设计】自主HTTP服务器

目录 项目介绍 网络协议栈介绍 协议分层 数据的封装与分用 HTTP相关知识介绍 HTTP的特点 URL格式 URI、URL、URN HTTP的协议格式 HTTP响应协议格式 HTTP的请求方法 HTTP的状态码 HTTP常见的Header CGI机制介绍 CGI机制的概念 CGI机制的实现步骤 CGI机制的意义 …

阿里云k8s服务部署操作一指禅

文章目录 DockerFile镜像操作阿里云k8s服务部署 DockerFile # 使用 JDK 17 官方镜像 # linux架构&#xff1a;FROM --platformlinux/amd64 openjdk:17-jdk-slim # arm架构&#xff1a;openjdk:17-jdk-slim FROM --platformlinux/amd64 openjdk:17-jdk-slim# 设置工作目录 WORK…

lattice hdl实现spi接口

在lattice工具链中实现SPI接口通常涉及以下步骤: 定义硬件SPI接口的管脚。配置SPI时钟和模式。编写SPI主机或从机的控制逻辑。 展示了如何在Lattice工具链中使用HDL语言(例如Verilog)来配置SPI接口: lattice工程 顶层:spi_slave_top.v `timescale 1ns/ 1ps module spi_…