当前位置: 首页 > news >正文

链表习题精选(持续更新中)

第一题

给定单链表的头节点 head ,将所有索引为奇数的节点和索引为偶数的节点分别组合在一起,然后返回重新排序的列表。

第一个节点的索引被认为是 奇数 , 第二个节点的索引为 偶数 ,以此类推。

请注意,偶数组和奇数组内部的相对顺序应该与输入时保持一致。

你必须在 O(1) 的额外空间复杂度和 O(n) 的时间复杂度下解决这个问题。

struct ListNode* oddEvenList(struct ListNode* head)
{if (head == NULL){return head;}struct ListNode* odd = head;//直接把奇数的第一个作为奇数组头节点struct ListNode* even = head->next;//把偶数的第一个作为偶数组头节点struct ListNode* evenHead = even;while (even != NULL && even->next != NULL){odd->next = even->next;odd = odd->next;even->next = odd->next;even = even->next;}odd->next = evenHead;把偶数组接在奇数组之后return head;}

思考:此处的even != NULL && even->next != NULL能否调换?

答案是不可以,因为此处通过&&的短路现象避免一些访问空指针的错误

第二题

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2)
{if(list1==NULL){return list2;}else if(list2==NULL){return list1;}struct ListNode* newHead=list1;struct ListNode* cur2=list2;struct ListNode* cur1=list1;if(list1->val>list2->val){newHead=list2;cur2=cur2->next;}else{cur1=cur1->next;}struct ListNode* cur=newHead;while(cur1!=NULL&&cur2!=NULL){if(cur1->val<cur2->val){cur->next=cur1;cur=cur->next;cur1=cur1->next;}else{cur->next=cur2;cur=cur->next;cur2=cur2->next;}}if(cur1==NULL){cur->next=cur2;}else{cur->next=cur1;}return newHead;
}

本题主要是需要考虑情况完备,以及新手在编程时一定不要吝啬于多创建一个常量进行记录,能够让思路清晰很多

当然本题也可以通过带哨兵位的链表,当然思路大差不差,时间复杂度也都是O(n),空间复杂度依然为O(1)。

struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2)
{    if (list1 == NULL){return list2;}else if (list2 == NULL){return list1;}struct ListNode* dummyHead = malloc(sizeof(struct ListNode));dummyHead->val = 0;struct ListNode* cur = dummyHead, * cur1 = list1, * cur2 = list2;while (cur1 != NULL && cur2 != NULL){if (cur1->val <= cur2->val){cur->next = cur1;cur1 = cur1->next;cur = cur->next;}else{cur->next = cur2;cur2 = cur2->next;cur = cur->next;}}if (cur1 != NULL){cur->next = cur1;}else if (cur2 != NULL){cur->next = cur2;}struct ListNode* ret = dummyHead->next;free(dummyHead);return ret;
}

第三题,排序链表

给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。

方法一:自顶向下归并排序

对链表自顶向下归并排序的过程如下。

第1步.找到链表的中间,以中点为分界,将链表拆分成两个子链表。寻找链表的中点可以使用快慢指针(快二慢一)当快指针到达链表末尾时,慢指针指向的链表节点即为链表的中点。对两个子链表分别排序。

第2步.不断递归向下二分后,对最小的两个子链表分别排序合并

第3步.将最后两个排序后的子链表合并,得到完整的排序后的链表。

上述过程可以通过递归实现。递归的终止条件是链表的节点个数小于或等于 1,即当链表为空或者链表只包含 1 个节点时,不需要对链表进行拆分和排序。

//合并函数,因为递归的地方已经解决了传入链表为空的问题,故可以不进行NULL的判断
struct ListNode* merge(struct ListNode* head1, struct ListNode* head2) {struct ListNode* dummyHead = malloc(sizeof(struct ListNode));dummyHead->val = 0;struct ListNode *temp = dummyHead, *temp1 = head1, *temp2 = head2;while (temp1 != NULL && temp2 != NULL) {if (temp1->val <= temp2->val) {temp->next = temp1;temp1 = temp1->next;} else {temp->next = temp2;temp2 = temp2->next;}temp = temp->next;}if (temp1 != NULL) {temp->next = temp1;} else if (temp2 != NULL) {temp->next = temp2;}return dummyHead->next;
}
//实现递归并终止的递归的函数
struct ListNode* toSortList(struct ListNode* head, struct ListNode* tail) {if (head == NULL) {return head;}if (head->next == tail) {head->next = NULL;return head;}struct ListNode *slow = head, *fast = head;while (fast != tail) {slow = slow->next;fast = fast->next;if (fast != tail) {fast = fast->next;}}struct ListNode* mid = slow;return merge(toSortList(head, mid), toSortList(mid, tail));
}//调用的排序函数
struct ListNode* sortList(struct ListNode* head) {return toSortList(head, NULL);
}

时间复杂度:O(nlogn),其中 n 是链表的长度。

空间复杂度O(logn),其中 n 是链表的长度。空间复杂度主要取决于递归调用的栈空间。

第四题

给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
struct ListNode* removeElements(struct ListNode* head, int val){if(head==NULL){return NULL;}struct ListNode *dummyHead=(struct ListNode*)malloc(sizeof(struct ListNode));dummyHead->next=head;struct ListNode*cur=dummyHead;//利用哨兵位,避免传入空指针的情况,而对下一个数据进行检索的写法。while(cur->next!=NULL)//当遇到倒数第二个节点时 if else语句已经解决了尾数据是该删还是不该删{if(cur->next->val==val){cur->next=cur->next->next;//跳过该节点指向下下个节点}else{cur=cur->next;//直接接入下一个数据,若接入的是尾数据则跳出循环}}return dummyHead->next;
}

第五题

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/struct ListNode* reverseList(struct ListNode* head){struct ListNode* dummyHead=malloc( sizeof(struct ListNode) );struct ListNode*cur1=head;struct ListNode*cur2=NULL;//尾的next置为空while(cur1)//依次取下链表的数据连接在NULL上面{struct ListNode *tmp=cur1->next;cur1->next=cur2;cur2=cur1;cur1=tmp;}return cur2;
}

相关文章:

链表习题精选(持续更新中)

第一题给定单链表的头节点 head &#xff0c;将所有索引为奇数的节点和索引为偶数的节点分别组合在一起&#xff0c;然后返回重新排序的列表。第一个节点的索引被认为是 奇数 &#xff0c; 第二个节点的索引为 偶数 &#xff0c;以此类推。请注意&#xff0c;偶数组和奇数组内部…...

【log】操作类日志处理 与 报错类日志处理logback

文章目录一、操作类日志处理【环绕增强】aop环绕增强导包第一步&#xff1a;自定义注解interface第二步&#xff1a;在Controller写一个测试的方法&#xff1a;第三步&#xff1a;编写LogAspect增强类与增强方法日志写入数据库&#xff08;使用mybatis&#xff09;第一步&#…...

百度网盘好友发来的文件手动输入JS选择代码批量保存

基本代码&#xff1a;document.getElementsByClassName(global-clearfix)[3].getElementsByTagName(li)[0].getElementsByTagName(a)[0].click();范围选择函数&#xff1a;这个要手动全部取消选择function sel(a,b){var alidocument.getElementsByClassName(global-clearfix)[3…...

【CS224W】(task6)Google的PageRank算法

note 求解pagerank&#xff1a;用power iteration&#xff08;幂迭代&#xff09;方法求解 rM⋅r\mathbf{r}\mathbf{M} \cdot \mathbf{r}rM⋅r ( MMM 是重要度矩阵)用random uniform teleporation解决dead-ends&#xff08;自己指向自己&#xff09;和spider-traps&#xff08…...

Python安装拓展库及常用的pip命令及其用法

Python安装拓展库 在Python中&#xff0c;库是一些预先编写好的代码和函数&#xff0c;它们可以帮助你解决特定的问题。如果你想要扩展Python库&#xff0c;通常有两种方法&#xff1a;使用现有的第三方库&#xff0c;或者编写自己的库。 1.使用现有的第三方库 Python社区中…...

这9道软件测试面试题,就能刷掉90%的软件测试员

转眼就要到“金三银四”了&#xff0c;没点真本事真技术&#xff0c;没点面试经验&#xff0c;不了解点职场套路&#xff0c;如何过五关斩六将&#xff1f;如何打败面试官&#xff1f;如何拿下那梦寐以求的offer&#xff1f; 如果你的跳槽意向已经很确定&#xff0c;那么请往下…...

【大数据】大数据Hadoop生态圈

文章目录大数据Hadoop生态圈-组件介绍1、HDFS&#xff08;分布式文件系统&#xff09;2、MapReduce&#xff08;分布式计算框架&#xff09;3、Spark&#xff08;分布式计算框架&#xff09;4、Flink&#xff08;分布式计算框架&#xff09;5、Yarn/Mesos&#xff08;分布式资源…...

python读取tif图像+经纬度

python读取tif的包很多&#xff0c;但大都只能读出图像像素值&#xff0c;不能读取到经纬度信息。原因&#xff1a;TIFF 简单理解就是一种图像格式&#xff0c;类似于 jpg、png 等。GeoTIFF 就是在普通 TIFF 文件上增加了地理位置、投影信息、坐标信息等&#xff0c;常用于遥感…...

Kali安装配置vulhub

一、vulhubVulhub是一个基于docker和docker-compose的漏洞环境集合&#xff0c;进入对应目录并执行一条语句即可启动一个全新的漏洞环境&#xff0c;主要利用于漏洞复现。Vulhub的官方地址为www.vulhub.org。二、搭建vulhub靶场2.1 开启kali虚拟机2.2 安装docker先更新一下软件…...

【进击的算法】动态规划——不同维度的背包问题

文章目录前言动态规划的维度二维动规leetcode416、分割等和子集leetcode1049. 最后一块石头的重量 IIleetcode494、目标和三维动规leetcode474. 一和零结语前言 大家好久不见&#xff0c;这次我们一起来学习一下动态规划中怎么确定维度&#xff0c;和对应问题如何解决。 动态…...

udiMagic 导入 Excel to Tally ERP Crack

关于 udiMagic 软件 udiMagic 是一款可帮助您快速轻松地将数据导入 Tally ERP 的应用程序。它由 Shweta Softwares 创建和分发&#xff0c;于2007 年首次推出。 您可以在 USB 闪存驱动器 [旅行许可证] 中携带 udiMagic&#xff0c;并在具有任何 Tally 版本的任何计算机上使用…...

Redis实现分页和多条件模糊查询方案

导言 Redis是一个高效的内存数据库&#xff0c;它支持包括String、List、Set、SortedSet和Hash等数据类型的存储&#xff0c;在Redis中通常根据数据的key查询其value值&#xff0c;Redis没有模糊条件查询&#xff0c;在面对一些需要分页、排序以及条件查询的场景时(如评论&…...

【H5 | CSS | JS】如何实现网页打字机效果?快收下这份超详细指南(附源码)

&#x1f482;作者简介&#xff1a; THUNDER王&#xff0c;一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学会计学专业大二本科在读&#xff0c;同时任汉硕云&#xff08;广东&#xff09;科技有限公司ABAP开发顾问。在学习工作中&#xff0c;我通常使用偏后…...

Airbyte,数据集成的未来

Gartner 曾预计&#xff0c;到 2025 年&#xff0c;80% 寻求扩展数字业务的组织将失败。因为他们没有采用现代方法来进行数据和分析治理。数据生态是基础架构生态的最重要一环&#xff0c;数据的处理分发与计算&#xff0c;从始至终贯穿了整个数据流通生态。自从数据集中在数据…...

00.内容安排

内容安排如下01.Linux基本命令0.2 vim编辑器&#xff0c;gcc、gdb、makefile、动/静态库制作使用03.文件 I/O 常用函数、文件读写原理、进程控制快概念、阻塞、非阻塞概念04.文件常用操作函数、目录常用操作函数、重定向05.进程控制fork、exec函数组、进程回收 wait/waitpid06.…...

FreeRTOS任务基础知识

单任务和多任务系统单任务系统单任务系统的编程方式&#xff0c;即裸机的编程方式&#xff0c;这种编程方式的框架一般都是在main&#xff08;&#xff09;函数中使用一个大循环&#xff0c;在循环中顺序的执行相应的函数以处理相应的事务&#xff0c;这个大循环的部分可以视为…...

JDBC-API详解、SQL注入演示、连接池

文章目录JDBC1&#xff0c;JDBC概述1.1 JDBC概念1.2 JDBC本质1.3 JDBC好处2&#xff0c;JDBC快速入门2.1 编写代码步骤2.2 具体操作3&#xff0c;JDBC API详解3.1 DriverManager3.2 Connection &#xff08;事务归我管&#xff09;3.2.1 获取执行对象3.2.2 事务管理3.3 Stateme…...

C 学习笔记 —— 动态分配内存(malloc)

文章目录分配内存malloccallocrealloc创建数组方式free的重要性举例常见动态分配内存错误忘记检查所请求的内存对NULL指针进行解引用对分配的内存越界访问释放一块内存后&#xff0c;继续使用释放一块内存的一部分是不允许的内存泄漏分配内存 当一个数组声明时&#xff0c;需要…...

RK3588通用布线设计指南

&#xff08;1&#xff09;走线长度应包含过孔和封装。&#xff08;2&#xff09;由于表贴器件的焊盘会导致阻抗降低&#xff0c;为减小阻抗突变的影响&#xff0c;建议在表贴焊盘的正下方按焊盘大小挖去一层参考层。常用的表贴器件有&#xff1a;电容、 ESD、共模抑制电感、连…...

ChatGPT也懂如何设计开发板!?

到底应该如何设计一款开发板&#xff1f;我们问了一下最近风很大的ChatGPT&#xff0c;得出了这样的回答&#xff1a; 或者这样的回答&#xff1a; 显而易见&#xff0c;RK3568开发板是一款功能丰富&#xff0c;性能优异&#xff0c;易于开发的高性能开发板&#xff0c;适用于各…...

大型房地产集团战略规划数字化转型PMO项目进度管理解决方案(PPT)

导读 有一个问题值得认真想一想&#xff1a;一家布局全国、同时管理几十个楼盘的大型地产集团&#xff0c;它的"项目管理"问题&#xff0c;究竟出在哪里&#xff1f; 不是因为缺人&#xff0c;也不是因为团队不努力。事实上&#xff0c;大多数地产集团在规模扩张到一…...

经手100万+终端后,聊聊校园门锁Sub-1G和Cat.1怎么选

做校园联网门锁项目的人大概都遇到过这个纠结&#xff1a;组网方案到底选Sub-1G还是4G Cat.1&#xff1f;我们团队&#xff08;KEENZY中科易安&#xff09;经手了100万在线终端的运行数据&#xff0c;可以明确地说——两种方案没有绝对的优劣&#xff0c;只有场景是否匹配。选错…...

【巴洛克AI生成合规白皮书】:基于梵蒂冈档案馆高清藏品训练的192个版权安全Prompt模板

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;巴洛克AI生成合规白皮书导论 巴洛克AI生成合规白皮书旨在为组织在部署和运营生成式人工智能系统时&#xff0c;提供一套可落地、可审计、可演进的合规治理框架。该白皮书聚焦于中国《生成式人工智能服务管理暂…...

这份榜单够用!盘点2026年断层领先的的AI论文写作软件

一天写完毕业论文在2026年已不再是天方夜谭。以下是2026年最炸裂、实测能大幅提速的AI论文写作软件&#xff0c;覆盖选题构思、文献综述、数据整理、格式排版等核心场景&#xff0c;帮你高效搞定论文。 一、全流程王者&#xff1a;一站式搞定论文全链路&#xff08;一天定稿首选…...

python高校学生党员信息管理系统_829h59n3

目录同行可拿货,招校园代理 ,本人源头供货商项目背景核心功能技术实现项目特点应用价值项目技术支持源码获取详细视频演示 &#xff1a;同行可合作点击我获取源码->获取博主联系方式->进我个人主页-->同行可拿货,招校园代理 ,本人源头供货商 项目背景 高校学生党员信…...

第八篇:《软件测试的经济学:投入与回报》

在商业环境中&#xff0c;测试不是“免费”的——它需要人力、工具、时间。但缺陷也不是免费的——它可能导致损失、赔偿、用户流失。如何让管理者理解“投入测试是投资&#xff0c;而不是成本”&#xff1f;本文将从经济学角度分析测试的投资回报率&#xff08;ROI&#xff09…...

如何三步实现AI虚拟试衣:OOTDiffusion从安装到实战的完整指南

如何三步实现AI虚拟试衣&#xff1a;OOTDiffusion从安装到实战的完整指南 【免费下载链接】OOTDiffusion [AAAI 2025] Official implementation of "OOTDiffusion: Outfitting Fusion based Latent Diffusion for Controllable Virtual Try-on" 项目地址: https://…...

如何将企业微信 RPA 抽象为高可用的外部群自动化 API?

在做企业微信外部群&#xff08;如跨群互动、自动化精准群发、批量建群&#xff09;的自动化能力时&#xff0c;业界通常面临两种选型&#xff1a;一种是直接攻克底层协议&#xff0c;但面临极高的安全风控与多变协议的维护成本&#xff1b;另一种是基于 RPA&#xff08;机器人…...

【2026电赛国奖秘籍】别再用L298N了!无刷电机FOC(位置/速度双环)速成与避坑指南

&#x1f4dd; 前言&#xff1a;为什么电赛控制类一定要懂FOC&#xff1f;参加过电赛控制类&#xff08;如自平衡小车、双轴追光云台、风力摆、倒立摆&#xff09;的同学都知道&#xff0c;传统的“直流有刷电机 L298N/TB6612 增量式编码器”方案在面对极低速运转和精确定位时…...

别再重复造轮子!用PADS自带转换器+立创EDA,5分钟搞定原理图符号同步

高效复用立创EDA资源&#xff1a;PADS原理图符号同步实战指南 在硬件设计领域&#xff0c;重复绘制原理图符号堪称工程师的"时间黑洞"。当你在立创EDA上发现完美的元器件模型时&#xff0c;为何还要在PADS中从零开始&#xff1f;本文将揭示一套被多数人忽视的PADS原生…...