leetcode-分割链表

server/2024/11/9 16:41:11/

题目

面试题 02.04. 分割链表

提示

给你一个链表的头节点 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

图解

 

代码(解析在代码注释中)

/*** 定义单链表结构体* struct ListNode {*     int val;         // 节点值*     struct ListNode *next; // 指向下一个节点的指针* };*/typedef struct ListNode ListNode;/*** @brief 将给定的单链表按照指定数值 `x` 进行分区操作,具体思路如下:* - 创建两个链表,分别用于存储小于 `x` 的节点(小链表)和大于等于 `x` 的节点(大链表)* - 遍历原链表,将每个节点与 `x` 进行比较,然后采用尾插法将节点分别插入到小链表或大链表中* - 当遍历结束后,将小链表尾部与大链表头部进行连接,并确保大链表的最后一个节点的 `next` 指针设置为 `NULL`** @param head 输入单链表的头节点指针* @param x 作为分区依据的数值* @return 新的已分区后单链表的头节点指针*/
struct ListNode* partition(struct ListNode* head, int x) {// 初始判断:如果链表为空,则直接返回空指针if (head == NULL) {return head;}// 创建两个链表,分别用于存储小于x的节点和大于等于x的节点,并初始化它们的头尾指针ListNode *Big_head = (ListNode*)malloc(sizeof(ListNode)), *Big_tail = Big_head;ListNode *Small_head = (ListNode*)malloc(sizeof(ListNode)), *Small_tail = Small_head;// 设置两个链表的起始哨兵节点,它们的next指针均初始化为NULLBig_head->next = NULL;Small_head->next = NULL;// 遍历原始链表,根据节点值大小将其插入相应的小链表或大链表中(尾插法)ListNode* tmp = head;while (tmp != NULL) {if (tmp->val < x) {Small_tail->next = tmp;Small_tail = Small_tail->next;} else {Big_tail->next = tmp;Big_tail = Big_tail->next;}tmp = tmp->next; // 移动到下一个待处理的节点}// 确保大链表尾部的next指针置为NULL,以正确结束链表Big_tail->next = NULL;// 将小链表尾部与大链表头部连接起来,形成最终分区后的链表Small_tail->next = Big_head->next;// 释放哨兵节点占用的内存,并重新定位新的链表头指针ListNode* new_head = Small_head->next;free(Small_head);free(Big_head);Small_head = Big_head = NULL;return new_head;
}


http://www.ppmy.cn/server/8515.html

相关文章

Javascript基础

1.数组随机排序 let arr [1, 2, 3, 4, 5, 6, 7, 8, 9] // function result(params) { // for (let i 0; i < params.length; i) { // let randomIndex parseInt(Math.random() * params.length) // //定义完随机数后我们开始把当前数据存起来用于给赋值后的随…

Android 水滴屏、全屏适配

Android 水滴屏、全屏适配 何谓刘海屏&#xff1f;何谓水滴屏&#xff1f; 上述两种屏幕都可以统称为刘海屏&#xff0c;不过对于右侧较小的刘海&#xff0c;业界一般称为水滴屏或美人尖。 目前国内流行的手机厂商主要有&#xff1a;vivo、oppo、华为、小米。各厂商对刘海屏的…

【Linux系统编程】第六弹---权限的概念

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、什么是权限 2、权限的本质 3、Linux中的用户 4、Linux中文件的权限 4.1、文件访问者的分类(角色) 4.2、文件类型和访问权…

【Python】使用Python计算简单数值积分

题外话&#xff0c;Python语言命名的来源&#xff1a;&#xff08;见下图&#xff09;Monty Python巨蟒剧团 1、积分题目&#xff08;3&#xff09; 2、解析解答 3、Python计算代码 import math import scipy.integrate as integrate# 积分区间 # x_min 0.0 # 1 # x_min …

互联网大厂Spring Cloud面试题及参考答案(持续更新)

目录 什么是Spring Cloud Eureka? 如何在Spring Cloud应用中集成Eureka Server? 解释Eureka中的自我保护模式是什么&#x

imx6ull设备树驱动--pinctl、ioctl

添加pinctl节点 进入arch/arm/boot/dts目录下dts文件 在iomuxc下添加pinctlled节点 将 GPIO1_IO03 这个 PIN 复用为 GPIO1_IO03&#xff0c;电气属性&#xff08;配置GPIO一些列寄存器&#xff09;值为 0X10B0 添加led设备节点 与上一节一样&#xff0c;在 / 下面添加设备节…

《星尘传说》游戏完整源码(源码+引擎+客户端+服务端+教程+工具),云盘下载

《星尘传说》是一款奇幻类大型多人在线角色扮演电脑客户端游戏&#xff0c;该游戏设置有两大阵营&#xff0c;六个国家以及22个职业&#xff0c;采用3D卡通风格&#xff0c; 有兴趣的&#xff0c;可以架设个外网&#xff0c;让大家一起玩。 《星尘传说》游戏完整源码&#xff0…

了解医疗设备控费系统之后,客户最关心的问题都有哪些?

在繁忙纷扰的医院环境中&#xff0c;各种管理挑战层出不穷&#xff0c;这些也常被媒体捕捉并报道&#xff0c;引起社会的广泛关注。对于医疗行业的专业人士来说&#xff0c;这些问题更是耳熟能详&#xff0c;他们一直在寻找解决方案。卓健易控-控费专家研发的基于人工智能的医疗…