链表OJ(四)链表排序合集

news2024/9/24 9:25:24

目录

合并两个排序的链表

合并k个已排序的链表

单链表的排序

链表的奇偶重排

链表的奇偶重排扩展


合并两个排序的链表

描述

输入两个递增的链表,单个链表的长度为n,合并这两个链表并使新链表中的节点仍然是递增排序的。

数据范围: 0≤n≤10000≤n≤1000,−1000≤节点值≤1000−1000≤节点值≤1000
要求:空间复杂度 O(1)O(1),时间复杂度 O(n)O(n)

如输入{1,3,5},{2,4,6}时,合并后的链表为{1,2,3,4,5,6},所以对应的输出为{1,2,3,4,5,6},转换过程如下图所示:

或输入{-1,2,4},{1,3,4}时,合并后的链表为{-1,1,2,3,4,4},所以对应的输出为{-1,1,2,3,4,4},转换过程如下图所示:

示例1

class Solution {
public:
    ListNode* Merge(ListNode* pHead1, ListNode* pHead2) {
		ListNode* newhead = new ListNode(0);
		ListNode* p = newhead;
		ListNode* l1 = pHead1, *l2 = pHead2;
		while(l1 && l2)
		{
			if(l1->val <= l2->val)    // 创建一个头结点,让头结点依次按序接入各个结点
			{
				p->next = l1;
				l1 = l1->next;
			}
			else
			{
				p->next = l2;
				l2 = l2->next;
			}
		 	p = p->next;
		}
		p->next = l1 ? l1 : l2;    // 记得循环跳出后对剩余结点的接入
		return newhead->next;
    }
};

合并k个已排序的链表

描述

合并 k 个升序的链表并将结果作为一个升序的链表返回其头节点。

数据范围:节点总数 0≤n≤50000≤n≤5000,每个节点的val满足 ∣val∣<=1000∣val∣<=1000

要求:时间复杂度 O(nlogn)O(nlogn)

使用优先级队列,存储依次存储各个链表,然后根据链表首部元素的大小进行建堆,

每次从堆中取出堆顶链表,将堆顶链表pop取出,得到头结点数据后,链表后移重新入队

class Com
{
public:
    bool operator()(ListNode* left, ListNode* right)
    {
        return left->val > right->val;
    }
};

class Solution {
public:
    ListNode *mergeKLists(vector<ListNode*> &lists) {
        if(lists.empty())return nullptr;
        priority_queue<ListNode*, vector<ListNode*>, Com> q;    // 创建一个优先级队列,按照大于的比较方式存储
        for(auto &e : lists)
        {
            if(e!=nullptr)      // 对每个不空的结点进行入队列
                q.push(e);
        }
        ListNode* newhead = new ListNode(0);
        newhead->next = nullptr;
        ListNode* pre = newhead;
        while(!q.empty())
        {
            ListNode* cur = q.top();    // cur标记当前堆顶结点
            q.pop();
            pre->next = cur;      // 将它插入返回链表中
            cur = cur->next;    // 当前结点后移一步
            if(cur) 
                q.push(cur);    // 如果不为空就重新入队列
            pre = pre->next;
        }
        return newhead->next;
    }
};

单链表的排序

描述

给定一个节点数为n的无序单链表,对其按升序排序。

数据范围:0<n≤1000000<n≤100000,保证节点权值在[−109,109][−109,109]之内。

要求:空间复杂度 O(n)O(n),时间复杂度 O(nlogn)O(nlogn)

使用优先级队列,存储结点

class Com
{
public:
    bool operator()(const ListNode* left, const ListNode* right)
    {
        return left->val > right->val;
    }
};
class Solution {
public:
    ListNode* sortInList(ListNode* head) {
        // write code here
        priority_queue<ListNode*, vector<ListNode*>, Com> q;
        while(head)
        {
            q.push(head);        // 将每一个结点入队列
            head = head->next;
        }
        ListNode* newhead = new ListNode(0);
        ListNode* p = newhead;
        while(!q.empty())
        {
            ListNode* cur = q.top();    // 将堆顶结点依次取出置入新头结点后面
            q.pop();
            p->next = cur;
            p = p->next;
        }
        p->next = nullptr;
        return newhead->next;
    }
};

下面是使用按值存储并还原,这是因为上面的办法使用时我没有最后将p的next指向nullptr,导致p的屁股后面跟了一长串,这一长串都是一堆数据。

而上面的k个链表合并,他们每一个链表最终都走到了末尾空的位置。

class Com
{
public:
    bool operator()(const long long left, const long long right)
    {
        return left > right;
    }
};
class Solution {
public:
    ListNode* sortInList(ListNode* head) {
        // write code here            // 使用long long类型
        priority_queue<long long, vector<long long>, Com> q;
        while(head)
        {
            q.push(head->val);    // 存储值的优先级队列
            head = head->next;
        }
        ListNode* newhead = new ListNode(0);
        ListNode* p = newhead;
        while(!q.empty())
        {
            ListNode* cur = new ListNode(q.top());    // 用值将链表结点还原
            q.pop();
            p->next = cur;        // 插入newhead后面即可
            p = p->next;
        }
        return newhead->next;
    }
};

链表的奇偶重排

描述

给定一个单链表,请设定一个函数,将链表的奇数位节点和偶数位节点分别放在一起,重排后输出。

注意是节点的编号而非节点的数值。

class Solution {
public:
    ListNode* oddEvenList(ListNode* head) {
        // write code here
        if(head==nullptr)return nullptr;
        ListNode* slow = head, *fast = head->next;
        ListNode* link = fast;
        while(fast && fast->next)    // 注意这里fast 与 fast->next的判空
        {
            slow->next = fast->next;
            slow = slow->next;
            fast->next = slow->next;
            fast = fast->next;
            
            /*    俩种写法都可以
            slow->next = slow->next->next;
            fast->next = fast->next->next;
            slow = slow->next;
            fast = fast->next;
            */
        }
        slow->next = link;
        return head;
    }
};

链表的奇偶重排扩展

class Com
{
public:
    bool operator()(const ListNode* left, const ListNode* right)
    {
        return left->val > right->val;
    }
};
class Solution {
public:
    ListNode* oddEvenList(ListNode* head) {
        // write code here
        priority_queue<ListNode*, vector<ListNode*>, Com> q1;
        priority_queue<ListNode*, vector<ListNode*>, Com> q2;
        for(int i = 0; head; i++)
        {
            ListNode* newNode = new ListNode(head->val);
            if(i%2==0)
                q1.push(newNode);
            else
                q2.push(newNode);
            head = head->next;
        }
        ListNode* newhead1 = new ListNode(0);
        ListNode* p1 = newhead1;
        ListNode* newhead2 = new ListNode(0);
        ListNode* p2 = newhead2;
        while(!q1.empty())
        {
            p1->next = q1.top();
            q1.pop();
            p1 = p1->next;
        }
        while(!q2.empty())
        {
            p2->next = q2.top();
            q2.pop();
            p2 = p2->next;
        }
        p1->next = newhead2->next;
        p2->next = nullptr;
        return newhead1->next;
    }
};

 

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

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

相关文章

Spark12: SparkSQL入门

一、SparkSQL Spark SQL和我们之前讲Hive的时候说的hive on spark是不一样的。hive on spark是表示把底层的mapreduce引擎替换为spark引擎。而Spark SQL是Spark自己实现的一套SQL处理引擎。Spark SQL是Spark中的一个模块&#xff0c;主要用于进行结构化数据的处理。它提供的最核…

Kubernetes入门级教程

Kubernetes入门级教程1. Introduction1.1 概述1.2 关键字介绍2. Cluster Install2.1 Big Data -- Postgres3. 基础知识3.1 Pod3.2 控制器3.3 通讯模式3.4 服务发现4. Command4.0 编辑文件4.1 在宿主机执行命令4.2 创建资源对象4.3 查询资源对象4.4 查询资源描述4.5 修改资源4.6…

Linux 交换分区与链接文件

目录 SWAP交换分区扩展 fdisk 创建分区 mkswap 将逻辑分区/主分区格式化为交换分区&#xff08;make swap&#xff09; swapon 交换分区挂载 swapoff 卸载交换分区 vim /etc/fstab 永久挂载 将文件设置为交换分区 链接文件 软链接 硬链接 SWAP交换分区扩展 交换分区…

量子力学奇妙之旅-双态系统(后)

专栏: 高质量文章导航-持续更新中 引子: 感慨:对于还原论,物质深层结构的物理定律如此的复杂,求解一个简单的双态系统已经如此困难,运用了大量的近视方法,在宇宙真理面前,我们只是虫子啊,我们固有的概念里面对逻辑自洽性,对事物发展的可预测性必然性,真实世界的有…

2023美赛F题讲解+数据领取

我们给大家准备了F题的数据&#xff0c;免费领取&#xff01;在文末 国内生产总值(GDP)可以说是一个国家经济健康状况最著名和最常用的指标之--。它通常用于确定一个国家的购买力和获得贷款的机会,为各国提出提高GDP的政策和项目提供动力。GDP“衡量一个国家在给定时间段内生产…

docker中 gitlab 安装、配置和初始化

小笔记&#xff1a;gitlab配置文件 /etc/gitlab/gitlab.rb 配置项jcLee95 的CSDN博客&#xff1a;https://blog.csdn.net/qq_28550263?spm1001.2101.3001.5343 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/article/details/1…

运动款蓝牙耳机哪个品牌好、市面最火爆的运动耳机推荐

我们都知道运动最不可或缺的就是音乐了&#xff0c;它俩是天生的好搭档&#xff0c;所以凡是很经常运动的小伙伴一定会去单独选择一款超好用的运动耳机&#xff0c;来增强运动体验效果&#xff0c;那么市面上的运动耳机那么多&#xff0c;怎么选择一款好用的运动耳机呢&#xf…

MySql 函数

1、简述 函数 是指一段可以直接被另一段程序调用的程序或代码。 也就意味着&#xff0c;这一段程序或代码在MySQL中已经给我们提供了&#xff0c;我们要做的就是在合适的业务场景调用对应的函数完成对应的业务需求即可。 MySQL中的函数主要分为以下四类&#xff1a; 字符串函数…

【TypeScrip】TypeScrip的任意类型(Any 类型 和 unknown 顶级类型):

文章目录一、安转依赖&#xff1a;【1】nodejs 环境执行ts【2】使用ts-node二、Any 类型 和 unknown 顶级类型【1】没有强制限定哪种类型&#xff0c;随时切换类型都可以 我们可以对 any 进行任何操作&#xff0c;不需要检查类型【2】声明变量的时候没有指定任意类型默认为any【…

基于SSM框架的生活论坛系统的设计与实现

基于SSM框架的生活论坛系统的设计与实现 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景…

已解决ImportError: cannot import name ‘featureextractor‘ from ‘radiomics‘

已解决from radiomics import featureextractor导包&#xff0c;抛出ImportError: cannot import name ‘featureextractor‘ from ‘radiomics‘异常的正确解决方法&#xff0c;亲测有效&#xff01;&#xff01;&#xff01; 文章目录报错问题报错翻译报错原因解决方法联系博…

centos7给已有分区进行扩容

1、背景 最近我在虚拟机上安装软件&#xff0c;发现磁盘空间不足&#xff0c;通过上网查找资料&#xff0c;发现可以通过如下方法进行磁盘扩容&#xff0c;此处进行记录一下。 2、实现扩容 1、虚拟机上添加一个新的硬盘 2、查看我们刚刚加入的硬盘 此处我们可以看到/dev/nvm…

Seata架构篇 - TCC模式

TCC 模式 概述 TCC 是分布式事务中的两阶段提交协议&#xff0c;它的全称为 Try-Confirm-Cancel&#xff0c;即资源预留&#xff08;Try&#xff09;、确认操作&#xff08;Confirm&#xff09;、取消操作&#xff08;Cancel&#xff09;。Try&#xff1a;对业务资源的检查并…

【MySQL进阶】视图 存储过程 触发器

&#x1f60a;&#x1f60a;作者简介&#x1f60a;&#x1f60a; &#xff1a; 大家好&#xff0c;我是南瓜籽&#xff0c;一个在校大二学生&#xff0c;我将会持续分享Java相关知识。 &#x1f389;&#x1f389;个人主页&#x1f389;&#x1f389; &#xff1a; 南瓜籽的主页…

Unity3D -知识点(1)

1.场景视图鼠标滚轮&#xff1a;场景放大缩小鼠标右键&#xff1a;场景左右平移场景编辑器中&#xff0c;能看到什么&#xff1f;网格&#xff0c;每一格大小为1unit&#xff0c;建模不同&#xff0c;规定不同&#xff0c;(对应屏幕上100个像素)世界坐标系y轴向上为正x轴向右为…

每天10个前端小知识 【Day 18】

前端面试基础知识题 1.如何实现单行&#xff0f;多行文本溢出的省略样式&#xff1f; 在日常开发展示页面&#xff0c;如果一段文本的数量过长&#xff0c;受制于元素宽度的因素&#xff0c;有可能不能完全显示&#xff0c;为了提高用户的使用体验&#xff0c;这个时候就需要…

2023金三银四跳槽必会Java核心知识点笔记整理

现在互联网大环境不好&#xff0c;互联网公司纷纷裁员并缩减 HC&#xff0c;更多程序员去竞争更少的就业岗位&#xff0c;整的 IT 行业越来越卷。身为 Java 程序员的我们就更不用说了&#xff0c;上班 8 小时需要做好本职工作&#xff0c;下班后还要不断提升技能、技术栈&#…

惠普LaserJet M1005 MFP报错b2

故障现象: 惠普LaserJet M1005 MFP开机后直接报b2错误; 检测维修: 故障大意是:机器的硬件可能出现点突变,此问题建议联系当地维修中心进行处理。

【计算机网络】网络层

文章目录网络层概述网络层提供的两种服务IPv4地址IPv4地址概述分类编址的IPv4地址划分子网的IPv4地址无分类编址的IPv4地址IPv4地址的应用规划IP数据报的发送和转发过程静态路由配置及其可能产生的路由环路问题路由选择路由选择协议概述路由信息协议RIP的基本工作原理开放最短路…

SciencePlots绘图

简介 使用Python作为核心开发工具的机器学习和深度学习研究者自然会希望使用Matplotlib进行科研图表的绘制&#xff0c;但是Matplotlib默认的样式并不适合科研论文的出版&#xff0c;而SciencePlots就是为此定制的一系列科研绘图样式库&#xff0c;可以绘制很合适科研图表。 …