链表经典算法OJ题目(2)

news/2024/5/19 0:35:20

1.寻找链表的中间节点

题目链接:876. 链表的中间结点 - 力扣(LeetCode)

53876226b4224dc8b7b7f3db85411bcc.png

我们来直接介绍一个思路:快慢指针

快慢指针是指我们创建创建2个指针,一个为快指针,一个为慢指针,且快指针一次走的步数是慢指针的两倍。两个指针同时往后走,当快指针为空或者快指针->next为空时,此时,慢指针的位置恰好是中间节点。

1.1 节点的个数为奇数

3a5cc9301ab24bb5b11d6912c465d3b4.png

3201bf0d95fc4f0b8d6b69a74321d651.png

79d8f7d76c00485886c142e917e135e0.png

上图为了方便理解,画了两条链表。其实两个指针是在一条链表里面实现的。

节点个数为奇数时,当fast指针走到节点末尾时,slow指针指针的位置恰好是节点的中间位置。

1.2 节点的个数为偶数

6d24a45361c249d4b3e1dc0c51c28588.png

61899d72e76741eb8d9ad6cb52ce5ef1.png

6bf3e8710ddc41f9b05771ba355f4952.png

当节点的个数为偶数时,当fast指针最后为空指针时,slow指针的位置恰好是节点的中间节点。

代码实现

typedef struct ListNode ListNode;
struct ListNode* middleNode(struct ListNode* head) {ListNode*slow=head;ListNode*fast=head;while(fast&&fast->next){slow=slow->next;fast=fast->next->next;}return slow;
}

注意事项:循环条件不能写成while(fast->next&&fast),因为当链表的节点个数为偶数个时,fast指针最终会为空指针,则fast->next就会报错,如果按照我上面那样写,当fast为空时,循环条件的表达式就会短路,不会执行后面的fast->next

2.合并两个有序链表 

做题链接:21. 合并两个有序链表 - 力扣(LeetCode)​​​​​

 

a59ffcbbab6241c3adb0d2f6c6f8c8bd.png

暴力解题思路:直接创建一个新链表,两个链表之间各个节点的数据依次进行比较,数据小的插入新链表。

1df362b82216406295e8f79bc9366acd.png

509f9f4102854ae8963f998e8e2edb94.png

3007576ce04b405e821ac795f4008e0e.png

fa21e0b1155f48ddbcb9e882aa55ed30.png

63c091693dcf4718975e8b0920b8fddf.png

79e06cfc3cd04c2eb89ddfd3a9a99c52.png

b90baaae49fe452d821f86b5a06416cc.png

4ac9d2df60e6405fa53c31c102b4c16d.png

16131afc210c4407a727235a9097bba8.png

6a54d4dbfa174267a73cc31f7d8a2ea2.png

69bb76696e924e1aa926de7ef451aa6f.png

e58547985d474d3d9eb0c797b6b8c83b.png

如上面的过程图所示,数据小对应的节点被拿出来插入新的节点,接着让对应的节点向后走到下一个节点,直到有一条链表走完。

代码实现

typedef struct ListNode ListNode;
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {if(list1==NULL){return list2;}if(list2==NULL){return list1;}//创建新链表ListNode*newhead,*newtail;newhead=newtail=NULL;//遍历原链表ListNode*l1=list1;ListNode*l2=list2;while(l1&&l2){if(l1->val<l2->val){if(newhead==NULL){newhead=newtail=l1;}else{newtail->next=l1;newtail=l1;}l1=l1->next;}else{if(newhead==NULL){newhead=newtail=l2;}else{newtail->next=l2;newtail=l2;}l2=l2->next;}}if(l1){newtail->next=l1;}if(l2){newtail->next=l2;}return newhead;
}

8095d638aa944314954b1b4c876af63e.png

当写完代码我们发现,如上图,有两段一样的代码,这就造成了代码的拥挤,造成有这两段带码的原因:因为新建的头节点和尾节点存在空指针的情况,需要就行判空。

解决方法:建立哨兵位,让哨兵位作为新的头节点,并且哨兵位不存放任何数据。

7d5d152385bf4dc18757f1c230a77f4c.png

优化代码

#include<stdlib.h>typedef struct ListNode ListNode;
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {if(list1==NULL){return list2;}if(list2==NULL){return list1;}//建立哨兵位ListNode*newhead,*newtail;newhead=newtail=(ListNode*)malloc(sizeof(ListNode));//遍历原链表ListNode*l1=list1;ListNode*l2=list2;while(l1&&l2){if(l1->val<l2->val){newtail->next=l1;newtail=l1;l1=l1->next;}else{newtail->next=l2;newtail=l2;l2=l2->next;}}if(l1){newtail->next=l1;}if(l2){newtail->next=l2;}ListNode*next=newhead->next;free(newhead);newhead=NULL;return next;
}

注意事项:使用malloc函数,最后要记得销毁掉,不然可能会造成内存溢出。

我们要返回的节点是哨兵位的下一个节点,因为返回前要将哨兵位销毁掉,所以我们要提前将哨兵位的下一个节点存储起来。 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


http://www.mrgr.cn/p/70246788

相关文章

关于使用MyBatis-Plus 报错:java.sql.SQLSyntaxErrorException: Table ssm_db.book doesnt exist 的解决方案

问题描述解决方案 在yml文件中插入以下配置 mybatis-plus:global-config:db-config:table-prefix: tbl_

浅析扩散模型与图像生成【应用篇】(二十)——TiNO-Edit

20. TiNO-Edit: Timestep and Noise Optimization for Robust Diffusion-Based Image Editing 该文通过对扩散模型中添加噪声的时刻 t k t_k tk​和噪声 N N N进行优化&#xff0c;提升SD等文生图模型的图像编辑效果。作者指出现有的方法为了提升文生图模型的图像编辑质量&…

快速入门一篇搞定RocketMq-实现微服务实战落地

1、RocketMq介绍 RocketMQ起源于阿里巴巴,最初是为了解决邮件系统的高可靠性和高性能而设计的。在2016年开源分布式消息中间件,并逐渐成为Apache顶级项目。现在是Apache的一个顶级项目,在阿里内部使用非常广泛,已经经过了"双11"这种万亿级的消息流转,性能稳定、…

Apache Shiro 721反序列化漏洞Padding Oracle Attack

Shiro721序列化是利用已登录用户的合法RememberMe Cookie值,然后从密码学的角度来攻击,构造Pyload。目录漏洞原理复现修复方式 漏洞原理 Shiro 的RememberMe Cookie使用的是 AES-128-CBC 模式加密。其中 128 表示密钥长度为128位,CBC 代表Cipher Block Chaining,这种AES算法…

STM32G474 CMAKE VSCODE 开发环境搭建

本篇博文尝试搭建 stm32g474 的开发环境 一. 工具安装 1. 关于 MinGW、OpenOCD、Zadig 这些工具的下载和安装见 JlinkOpenOCDSTM32 Vscode 下载和调试环境搭建_vscode openocd stm32 jlink-CSDN博客 2. 导出一个 STM32 的 CMAKE 工程&#xff0c;这里略过。 3. 安装 ninja …

Camunda User Task:Task Listeners

代码实现:@Component("testTaskListener") public class UserTaskListener implements TaskListener {@Overridepublic void notify(DelegateTask delegateTask) {} }

支付宝支付流程

第一步前端&#xff1a;点击去结算&#xff0c;前端将商品的信息传递给后端&#xff0c;后端返回一个商品的订单号给到前端&#xff0c;前端将商品的订单号进行存储。 对应的前端代码&#xff1a;然后再跳转到支付页面 // 第一步 点击去结算 然后生成一个订单号 // 将选中的商…

Camunda 流程执行错误处理ERROR BOUNDARY EVENT

ERROR BOUNDARY EVENT:在任务发生异常时候会触发走,在代码中必须显式抛出throw new BpmnError("error.....");public void execute(DelegateExecution delegateExecution) throws Exception {System.out.println("进来了>>>>>>>>>…

ZooKeeper知识点总结及分布式锁实现

最初接触ZooKeeper是之前的一个公司的微服务项目中&#xff0c;涉及到Dubbo和ZooKeeper&#xff0c;ZooKeeper作为微服务的注册和配置中心。好了&#xff0c;开始介绍ZooKeeper了。 目录 1.ZooKeeper的基本概念 2.ZooKeeper的节点&#xff08;ZNode&#xff09; 3. ZooKeep…

Redis基础篇笔记

一、Redis入门 1.认识NoSQL 1.1 什么是NoSQLNoSQL最常见的解释是"non-relational", 很多人也说它是"Not Only SQL" NoSQL仅仅是一个概念,泛指非关系型的数据库 区别于关系数据库,它们不保证关系数据的ACID特性 NoSQL是一项全新的数据库革命性运动,提倡…

基于WOA优化的CNN-GRU-Attention的时间序列回归预测matlab仿真

1.算法运行效果图预览 woa优化前woa优化后 2.算法运行软件版本 matlab2022a3.算法理论概述时间序列回归预测是数据分析的重要领域,旨在根据历史数据预测未来时刻的数值。近年来,深度学习模型如卷积神经网络(Convolutional Neural Network, CNN)、GRU以及注意力机制(Atten…

文字转语音软件下载教程

文字转语音软件下载教程 一&#xff0c;Whisper下载二&#xff0c;ggml-medium语言模型下载三&#xff0c;导入模型下载四&#xff0c;使用方法 一&#xff0c;Whisper下载 网址&#xff1a;https://bittly.cc/uL9xs 下拉选择&#xff1a; 进入下载页面&#xff0c;下载Whis…

xLua背包实践

准备工作 环境&#xff0c;代码 在C#代码方面我们需要准备单例模式基类&#xff0c;AB包管理器&#xff0c;lua解析器管理器 详情请见AB包管理器 xlua详解 然后是Xlua包和AB包&#xff0c;具体导入方法也在上面的链接中 然后是lua的三个文件 具体代码&#xff1a; JsonUtil…

Vue的项目启动指令分析

通过Vue CLI脚手架创建的项目&#xff0c;默认的启动项目方式是 npm run serve 这里的serve是可以修改的。 在创建的项目目录中&#xff0c;找到package.json 双击打开&#xff0c;找到scripts部分 在scripts部分&#xff0c;有一个"serve"键值对&#xff0c;这里的…

Merge Or Rebase

Merge Or Rebase 都具备分支间变更的能力:但是二者间实现手段大不相同 1. 实现手段 Merge(总是向前推进提交历史,并不会影响提交的原始状态) 我们在特性分支上,执行 # git 会以 我方、对方、以及双方最近公共祖先 对应的快照 ===> 执行三路合并生成新的快照 git merge …

m基于Yolov2深度学习网络的螺丝检测系统matlab仿真,带GUI界面

1.算法仿真效果 matlab2022a仿真结果如下:2.算法涉及理论知识概要基于YOLOv2(You Only Look Once version 2)深度学习网络的螺丝检测系统,是一种高效的目标检测方法,它在计算机视觉领域被广泛应用,尤其适合于实时检测和定位图像中的螺丝等小型物体。YOLOv2相较于初代YOLO…

代谢组数据分析七:从质谱样本制备到MaxQuant搜库

前言 LC-MS/MS Liquid Chromatography-Mass Spectrometry&#xff08;LC-MS/MS &#xff0c;液相色谱-质谱串联&#xff09;可用于残留化合物检测、有机小分子检测、鉴定和定量污染物以及在医药和食品领域添加剂检测和生物小分子等检测。 LC-MS/MS一般包含五个步骤&#xff…

BUUCTF——web题目练习

[极客大挑战 2019]LoveSQL 输入1 123 输入1 123 输入2 123 这里可以看出注入位置为password的后面&#xff0c;开始手动注入 闭合方式为1 [极客大挑战 2019]Secret File 查看页面源代码&#xff0c;发现里面有一个跳转页面的连接&#xff0c;点击进去&#xff0c;查看这个…

2024年13个最佳Scrum工具评测

本文将介绍2024年13个高级Scrum敏捷开发管理工具。Scrum 管理工具有:PingCode、Jira、Trello、Zoho Sprints、Active Collab、ProProfs Project、Scrumwise、ClickUp、Monday.com、QuickScrum、Yodiz、ScrumDo、nTask在过去几年中,Scrum方法论已成为敏捷项目管理的主要框架之…

鸿蒙开发前四章

鸿蒙开发前四章 第二章:开发环境搭建 首先要创建project,然后用Empty Activity模版,可以选visual(支持低代码可视化的开发)一个项目可以有多个module,new module选择同上,还可以导入module。第三章:开发一个harmonyOs应用 (1)创建一个新项目(用java写) 那么sdk版本…