【刷题之路Ⅱ】LeetCode 86. 分隔链表

news2024/11/17 11:53:11

【刷题之路Ⅱ】LeetCode 86. 分隔链表

  • 一、题目描述
  • 二、解题
    • 1、方法1——先分离再连接
      • 1.1、思路分析
      • 1.2、代码实现
    • 2、方法2——将较大的节点后移
      • 2.1、思路分析
      • 2.2、代码实现

一、题目描述

原题连接: 86. 分隔链表
题目描述:
给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。
你应当 保留 两个分区中每个节点的初始相对位置。

示例 1:

在这里插入图片描述
输入: head = [1,4,3,2,5,2], x = 3
输出: [1,2,2,4,3,5]

示例 2:

输入: head = [2,1], x = 2
输出: [1,2]

提示:
链表中节点的数目在范围 [0, 200] 内
-100 <= Node.val <= 100
-200 <= x <= 200

二、解题

1、方法1——先分离再连接

1.1、思路分析

我们可以额外创建两个链表Less和Great,将节点值小于x的节点全都按顺序插入到Less中,将节点值大于等于x的节点全都按顺序插入到Great中。然后将这两条链表连接起来(Less的尾连接上Greate的头)即可,例如:
在这里插入图片描述
所以我们的代码思路很快就可以出来了,我们使用一个cur指针遍历链表中的节点,当cur->val < x时,就将cur尾插到Less链表中,否则就尾插到Great链表中。
但需要特别注意的是,在所有节点都遍历完后一定要确保Great链表的尾节点的next指向的要是空,因为如果Great尾插的最后一个节点不是原链表的最后一个节点的话,那么它的next将仍然连接着它原来的下一个节点:
在这里插入图片描述
如果不加以处理的话,最终的新链表就会出现一个环了:
在这里插入图片描述

1.2、代码实现

有了以上思路,那我们写起代码来也就水到渠成了:

struct ListNode* partition(struct ListNode* head, int x) {
    struct ListNode *LessHead = (struct ListNode*)malloc(sizeof(struct ListNode));
    struct ListNode *LessTail = NULL; // 记录Less链表的尾
    struct ListNode *GreatHead = (struct ListNode*)malloc(sizeof(struct ListNode));
    struct ListNode *GreatTail = NULL; // 记录Great链表的尾
    struct ListNode *cur = head;
    LessTail = LessHead;
    GreatTail = GreatHead;
    // 创建带头结点的链表是为了更好的处理链表为空的情况
    while (cur) {
        if (cur->val < x) {
            LessTail->next = cur;
            LessTail = LessTail->next;
        } else {
            GreatTail->next = cur;
            GreatTail = GreatTail->next;
        }
        cur = cur->next;
    }
    GreatTail->next = NULL;
    LessTail->next = GreatHead->next;
    return LessHead->next;
}

时间复杂度:O(n),n为链表的长度,我们只需要遍历完链表中的所有节点就可以完成,所以时间复杂度为O(n)。
空间复杂度:O(1),我们们只需要用到常数级的额外空间。

2、方法2——将较大的节点后移

2.1、思路分析

还有一个不用创建新链表的方式就是将节点值大于等于x的节点尾插到链表的最后:
在这里插入图片描述
这样当我们把所有节点值大于等于x的节点都尾插完后,其实也是满足题目要求的相对位置不变的。
而对于结束的条件,我们可以优先记录好链表的长度len,然后当我们遍历的节点数等于len时就可以结束了。
所以我们需要优先记录的信息有两个分别是链表的长度len和尾节点tail。

2.2、代码实现

有了以上思路,那我们写起代码来也就水到渠成了:

struct ListNode* partition(struct ListNode* head, int x) {
    if (NULL == head || NULL == head->next) {
        return head;
    }
    int len = 1;
    struct ListNode *tail = head;
    while (tail->next) {
        len++;
        tail = tail->next;
    }

    struct ListNode *dumbNode = (struct ListNode*)malloc(sizeof(struct ListNode));
    if (NULL == dumbNode) {
        perror("malloc fail");
        return NULL;
    }
    dumbNode->next = head;
    struct ListNode *cur = head;
    int count = 0;
    struct ListNode *pre = dumbNode; // 记录cur的前一个节点
    struct ListNode *next = cur->next; // 记录cur的下一个节点
    while (count < len) {
        count++;
        next = cur->next;
        if ((cur->val >= x) && (cur->next)) { // cur的val大于等于x且cur不为最后一个节点
            pre->next = next;
            // 尾插
            tail->next = cur;
            cur->next = NULL;
            tail = tail->next;
        } else {
            pre = pre->next;
        }
        cur = next;
    }
    return dumbNode->next;
}

时间复杂度:O(n),n为链表的长度。
空间复杂度:O(1),我们只需要用到常数级的额外空间。

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

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

相关文章

科大讯飞交卷,实测星火大模型

作者 | 辰纹 来源 | 洞见新研社 星星之火&#xff0c;可以燎原。 5月6日&#xff0c;讯飞星火认知大模型揭开神秘面纱。 发布会上&#xff0c;科大讯飞董事长刘庆峰、研究院院长刘聪现场实测了星火大模型七大核心能力&#xff0c;并发布基于该大模型的教育、办公、汽车和数字…

docker-mysql的几个问题

来水一篇文章 文章目录 问题一&#xff1a;问题2&#xff1a; 问题一&#xff1a; 在Navicat上执行大脚本mysql的sql文件时&#xff0c;出现插入数据报错的问题&#xff0c;查了一下innodb_log_file_size参数show variables like innodb_log_file_size;只有50331648即48M&…

WB_BF项目问题说明以及探究

我就现在WB_BF项目群里面提到的“根据测试脚本运行日志来看&#xff0c;bf运行了约31小时后又开始出现了api调用返回nginx的错误信息。之后&#xff0c;bf客户端也无法打开。”问题做一下说明&#xff0c;今天早上我在机器上复现了这一问题。针对于api调用会返回nginx的错误信息…

CTF权威指南 笔记 -第四章Linux安全机制-4.1-Linux基础

常用命令 这里给出linux常用命令 cd ls pwd 显示当前工作目录 uname 打印系统信息 whoami 打印用户名 man 查询帮助信息 find echo cat less head grep diff mv cp rm ps top kill touch 创建文件 mkdir 创建文件夹 chmod 变更权限 chown 变更所属者 nano 终端文本编辑器 e…

MySQL获取当前日期、时间、时间戳函数

目录 1.MySQL 获取当前日期时间 函数 1.1 获取当前日期&#xff08;date&#xff09;函数&#xff1a;curdate() 1.2 获取当前时间&#xff08;time&#xff09;函数&#xff1a;curtime() 1.3 获取当前日期时间&#xff08;date time&#xff09;函数&#xff1a;now() …

BClinux8.6 制作openssh9.3p1 rpm升级包和升级实战

一、背景说明 BClinux8.6 默认安装的openssh 版本为8.0&#xff0c;经绿盟扫描&#xff0c;存在高危漏洞&#xff0c;需要升级到最新。 官网只提供编译安装包&#xff0c;而BClinux8.6 为rpm方式安装。 为了方便升级&#xff0c;先通过编译安装包&#xff0c;制作rpm包&…

什么是无感电阻?无感电阻和普通电阻的区别

无感电阻&#xff0c;也称为电感电阻、电感器、电感元件等&#xff0c;是一种电气元件&#xff0c;常用于电子电路中&#xff0c;用于限制电流、防止电磁干扰等。无感电阻是指一种电阻器件&#xff0c;它能够在高频电路中工作而不会产生电感&#xff0c;从而避免了电感对电路性…

【Python】更改matplotlib绘图样式,要创建一个后缀名为mplstyle的样式清单,如何实现?

要更改 matplotlib 绘图样式&#xff0c;可以按照以下步骤创建一个后缀名为 mplstyle 的样式清单&#xff1a; 打开终端或 Anaconda Prompt&#xff08;Windows 用户&#xff09;&#xff1b;确保您的 Matplotlib 版本是 2.0.0 以上版本&#xff0c;通过运行&#xff1a; imp…

被裁现状,给找工作的同学一些建议

2022 到 2023 国内知名互联网公司腾讯、阿里、百度、快手、滴滴、京东、阿里、爱奇艺、知乎、字节跳动、小米等公司均有裁员&#xff0c;其中有不少公司&#xff0c;在过去年的一整年&#xff0c;进行了多轮裁员&#xff0c;以下是网传的一张 “2022 年裁员企业名单”。 这些裁…

【单目标优化算法】孔雀优化算法(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

介绍一个empty(空状态描述)全端通用的空状态描述组件

介绍 这是一个全端通用的空状态描述组件&#xff0c;集成了25种常用场景&#xff0c;支持自定义图标及内容&#xff0c;快点下载试试吧。 插件含全部源码&#xff0c;可以给您无限实现可能&#xff0c;随心所欲自定义你的功能&#xff1b;符合uni_modules和easycom规范&#…

什么是web3 | 区块链web3.0人才

文章目录 一、Web31. 什么是web3&#xff1f;2. web3的dapp架构 二、区块链web3.0人才1. 区块链开发技术栈2. 欧易对人才的要求3. 如何成为一名合格的智能合约高级工程师4. web3各个赛道5. 链上数据分析师6. 一些案例 三、参考 一、Web3 1. 什么是web3&#xff1f; 20世纪90年…

百度搜索排名的提升,就靠这10个优化技巧!

随着互联网的快速发展&#xff0c;网站排名已经成为了企业竞争的一个重要指标。其中&#xff0c;百度搜索排名的提升更是众多企业都非常关注的问题。因此&#xff0c;在这篇文章中&#xff0c;我将为大家介绍10个优化技巧&#xff0c;以帮助企业提升百度搜索排名。 1.关键词优化…

MG100-Hi3798MV100-当贝纯净桌面卡刷固件包

MG100-Hi3798MV100-当贝纯净桌面卡刷固件包-内有教程及短接点 特点&#xff1a; 1、适用于对应型号的电视盒子刷机&#xff1b; 2、开放原厂固件屏蔽的市场安装和u盘安装apk&#xff1b; 3、修改dns&#xff0c;三网通用&#xff1b; 4、大量精简内置的没用的软件&#xf…

MySQL基础篇补充 | 多表查询中使用SQL99实现7种JOIN操作、SQL99语法新特性

目录 一&#xff1a;多表查询中使用SQL99实现7种JOIN操作 二&#xff1a;SQL99语法新特性 1. 自然连接Natural 2. USING连接 一&#xff1a;多表查询中使用SQL99实现7种JOIN操作 在多表查询中&#xff0c;除了遇到最多的内连接、左外连接和右外连接&#xff0c;还有其它的…

GPT-4与人工智能的未来:微软CTO对话比尔·盖茨

一系列技术变革引领我们走到今天&#xff0c;并深刻影响着人类社会。如今&#xff0c;随着人工智能技术的快速发展&#xff0c;ChatGPT、New Bing、GPT-4 等新产品和新技术的陆续发布&#xff0c;又将如何帮助我们创造未来&#xff1f;在微软与 OpenAI 的密切合作中&#xff0c…

Packet Tracer - 使用 CLI 配置 IOS 入侵防御系统 (IPS)

Packet Tracer - 使用 CLI 配置 IOS 入侵防御系统 (IPS) 拓扑图 地址分配表 设备 接口 IP 地址 子网掩码 默认网关 交换机端口 R1 G0/1 192.168.1.1 255.255.255.0 不适用 S1 F0/1 S0/0/0 10.1.1.1 255.255.255.252 不适用 不适用 R2 S0/0/0 (DCE) 10.1.1.…

服装生产erp都有哪些功能?该如何选服装生产erp?

各位开服装工厂的老板是否遇到这些难题&#xff1a; 库存管理成本高&#xff0c;大量库存积压导致资金紧张&#xff1b; 车间用人成本高&#xff0c;工人工作效率低&#xff0c;浪费大量时间和资金成本&#xff1b; 生产、加工、成品出库等各环节无法顺畅衔接&#xff0c;补单困…

Wikidata 数据包下载+格式转换+入库MySQL

1. Wikidata 简介 维基数据是一个自由的协作式的多语言辅助数据库&#xff0c;用于收集结构化的数据&#xff0c;旨在支援维基百科、维基共享资源以及其他维基媒体运动中的项目&#xff0c;也支援世界上的每一个人。 官网&#xff1a;https://www.wikidata.org/wiki/Wikidata:M…

在“裸奔”时代保护我们的隐私:网络攻击、数据泄露与隐私侵犯的应对策略与工具

摘要&#xff1a;随着信息技术的普及和发展&#xff0c;个人隐私和数据安全问题日益受到威胁。本文将讨论如何有效应对网络攻击、数据泄露和隐私侵犯&#xff0c;并提供一系列实用的技巧和工具&#xff0c;以帮助我们在“裸奔”时代更好地保护数据安全和隐私。 当今社会&#…