反转链表、链表的中间结点、合并两个有序链表【LeetCode刷题日志】

 一、反转链表

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

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

思路一:翻转单链表指针方向

这里解释一下三个指针的作用:

n1:记录上一个节点,如果是第一个就指向空

n2:记录此节点的位置

n3:记录下一个节点的位置,让翻转后能找到下一个节点,防止丢失指针的地址

/** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
struct ListNode* reverseList(struct ListNode* head) {if(head == NULL){return NULL;}//初始条件struct ListNode* n1 = NULL,*n2 = head,*n3 = n2->next;//结束条件while(n2){//迭代过程n2->next = n1;n1 = n2;n2 = n3;if(n3)n3 = n3->next;}return n1;
}

思路二:头插法

取原链表节点头插到新链表

/** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
struct ListNode* reverseList(struct ListNode* head) {struct ListNode* cur = head;struct ListNode* newHead = NULL;while(cur){struct ListNode* next = cur->next;//头插cur->next = newHead;newHead = cur;cur = next;}return newHead;
}

二、链表的中间结点

给你单链表的头结点 head ,请你找出并返回链表的中间结点。

如果有两个中间结点,则返回第二个中间结点。

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

思路一:单指针法

  • 时间复杂度:O(N*1.5),其中 N 是给定链表的结点数目。

  • 空间复杂度:O(1),只需要常数空间存放变量和指针。

我们可以对链表进行两次遍历。第一次遍历时,我们统计链表中的元素个数 N;第二次遍历时,我们遍历到第 N/2 个元素(链表的首节点为第 0 个元素)时,将该元素返回即可。

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
struct ListNode* middleNode(struct ListNode* head) {int n = 0;struct ListNode*cur = head;while(cur != NULL){++n;cur = cur->next;}int k = 0;cur = head;while(k < n/2){++k;cur = cur->next;}return cur;
}

思路二:快慢指针法

  • 时间复杂度:O(N),其中 N 是给定链表的结点数目。

  • 空间复杂度:O(1),只需要常数空间存放 slow 和 fast 两个指针。

我们可以优化思路一,用两个指针 slow 与 fast 一起遍历链表。slow 一次走一步,fast 一次走两步。那么当 fast 到达链表的末尾时,slow 必然位于中间。

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
struct ListNode* middleNode(struct ListNode* head) {struct ListNode* slow = head,*fast = head;while(fast && fast->next){slow = slow->next;fast = fast->next->next;}return slow;
}

三、合并两个有序链表

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

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

思路一(迭代法):

定义一个头指针和一个尾指针,从小到大依次尾插,直到一个链表为空时结束

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) {if(l1 == NULL)    return l2;if(l2 == NULL)return l1;struct ListNode* head = NULL, *tail = NULL;while(l1 != NULL && l2 != NULL){if(l1->val < l2->val){//尾插if(tail == NULL){head = tail = l1;}else{tail->next = l1;tail = tail->next;}l1 = l1->next;}else{if(tail == NULL){head = tail = l2;}else{tail->next = l2;tail = tail->next;}l2 = l2->next;}}if(l1)tail->next= l1;if(l2)tail->next= l2;return head;
}

优化一:

先确定头结点,然后再循环判断val大小,尾插

struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) {if(l1 == NULL)    return l2;if(l2 == NULL)return l1;struct ListNode* head = NULL, *tail = NULL;//先确定头节点if(l1->val < l2->val){head = tail =l1;l1 = l1->next;}else{head = tail =l2;l2 = l2->next;}while(l1 && l2){//尾插if(l1->val < l2->val){   tail->next = l1;l1 = l1->next;}else{tail->next = l2;l2 = l2->next;}tail = tail->next;}if(l1)tail->next= l1;if(l2)tail->next= l2;return head;
}

优化二:

设置一个哨兵位的头节点,然后再去尾插。

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) {if(l1 == NULL)    return l2;if(l2 == NULL)return l1;struct ListNode* head = NULL, *tail = NULL;//哨兵位的头节点head = tail = (struct ListNode*)malloc(sizeof(struct ListNode));while(l1 && l2){//尾插if(l1->val < l2->val){   tail->next = l1;l1 = l1->next;}else{tail->next = l2;l2 = l2->next;}tail = tail->next;}if(l1)tail->next= l1;if(l2)tail->next= l2;struct ListNode* first = head->next;free(head);return first;
}

思路二(递归法):

(这是题解中大佬的一个解法)以迭代的思路写递归,尤为惊人!!!

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2){/*if判断:1.如果l1为空,返回l22.如果l2为空,返回l13.如果l1的值小于l2,比较l1的next值和l2,并把值赋给l1的下一个;返回l14.反之,比较l1和l2的next值,并把值赋给l2的下一个;返回l2*/if (l1 == NULL) {return l2;} else if (l2 == NULL) {return l1;} else if (l1->val < l2->val) {l1->next = mergeTwoLists(l1->next, l2);return l1;} else {l2->next = mergeTwoLists(l1, l2->next);return l2;}
}

因为有缓冲区的存在,C语言在操作文件的时候,需要做刷新缓冲区或者在文件操作结束的时候关闭文件。
如果不做,可能导致读写文件的问题。

今天就先到这了!!!

看到这里了还不给博主扣个:
⛳️ 点赞☀️收藏 ⭐️ 关注!

你们的点赞就是博主更新最大的动力!
有问题可以评论或者私信!!!

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

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

相关文章

linux支持的零拷贝类型以及java对应的支持

在之前整理的零拷贝文章基础上 https://blog.csdn.net/zlpzlpzyd/article/details/135321197 https://blog.csdn.net/zlpzlpzyd/article/details/135317834 得出如下 因为开发的程序很多运行在 linux 操作系统上&#xff0c;所以用 linux 进行讲解 linux 调用方式 dma复制次数…

Jupyter Notebook的10个常用扩展介绍

Jupyter Notebook&#xff08;前身为IPython Notebook&#xff09;是一种开源的交互式计算和数据可视化的工具&#xff0c;广泛用于数据科学、机器学习、科学研究和教育等领域。它提供了一个基于Web的界面&#xff0c;允许用户创建和共享文档&#xff0c;这些文档包含实时代码、…

Stable Diffusion 本地部署详细教程

目录 一、前言二、系统和硬件要求三、安装前说明四、安装步骤5、升级pip(这是管理python环境软件工具),并把资源库换成国内地址为清华镜像。一、前言 虽然MJ和SD都可以生成图像,但是为什么我们要考虑使用本地SD部署呢?原因其实很简单:首先,本地部署的使用成本更低,且更加…

(15)Linux 进程创建与终止函数forkslab 分派器

前言&#xff1a;本章我们主要讲解进程的创建与终止&#xff0c;最后简单介绍一下 slab 分派器。 一、进程创建&#xff08;Process creation&#xff09; 1、分叉函数 fork 在 中&#xff0c; fork 函数是非常重要的函数&#xff0c;它从已存在进程中创建一个新的进程。 …

Python异常处理TypeError: translation() got an unexpected keyword argument ‘codeset‘

背景 学习graphql-python安装好依赖后执行命令 python manage.py migrate python manage.py runserver仅接着出现下列错误&#xff0c;主要提示是 「TypeError: translation() got an unexpected keyword argument ‘codeset’」 ntribute_to_classself.remote_field.throug…

1885页学习资料。一本在手,python不愁!

python3.11即将于下半年发布&#xff0c;新的版本速度提升2倍&#xff0c;以弥补与其他编程语言在速度上的缺陷。可以预见Python语言在未来的应用范围会越来越广。 python学习方向建议&#xff1a; 如果你是本科及以下学历&#xff0c;建议你学习以下两个方向 1、爬虫。简单…

Matplotlib基础

目录&#xff1a; 一、绘制yx^2图像&#xff1a; 一、绘制yx^2图像&#xff1a; from matplotlib import pyplot as plt import numpy as np #生成&#xff08;-50,50&#xff09;的数组 x np.arange(-50,50) #计算因变量y的值 y x ** 2 #根据x、y数组绘制图形yx^2 plt.plot…

一文带你玩转Superset!大数据可视化框架学习网站大盘点!

介绍&#xff1a;Superset是一款由Airbnb开源的现代化企业级BI工具&#xff0c;它主要用于数据分析和可视化工作。作为Apache孵化器项目的一部分&#xff0c;它在处理复杂的数据分析需求上表现出色&#xff0c;并支持多种数据源和丰富的图表类型。 这款工具的主要特点包括自助分…

PE解释器之PE文件结构

PE文件是由许许多多的结构体组成的&#xff0c;程序在运行时就会通过这些结构快速定位到PE文件的各种资源&#xff0c;其结构大致如图所示&#xff0c;从上到下依次是Dos头、Nt头、节表、节区和调试信息(可选)。其中Dos头、Nt头和节表在本文中统称为PE文件头(因为SizeOfHeaders…

大数据毕业设计:基于python淘宝数据采集分析可视化系统 商品销量数据分析 计算机毕业设计(附源码+文档)✅

毕业设计&#xff1a;2023-2024年计算机专业毕业设计选题汇总&#xff08;建议收藏&#xff09; 毕业设计&#xff1a;2023-2024年最新最全计算机专业毕设选题推荐汇总 &#x1f345;感兴趣的可以先收藏起来&#xff0c;点赞、关注不迷路&#xff0c;大家在毕设选题&#xff…

【第31例】IPD产品开发计划阶段详解

目录 简介 详细内容 作者简介 简介 今天继续更新 IPD 进阶专栏。 这节内容主要来谈谈 IPD 产品开发计划阶段。 计划阶段的主要目标是回答“怎么做”的问题。 具体就是要: 清晰定义产品及竞争优势; 理解业务计划; 制定项目计划,以及资源计划; 确保风险可以被合理管理…

微软真是活菩萨,面向初学者的机器学习、数据科学、AI、LLM课程统统免费

微软真是活菩萨&#xff0c;面向初学者的机器学习、数据科学、AI、LLM课程统统免费 大家好&#xff0c;我是老章 推荐几个质量上乘且完全免费的微软开源课程 面向初学者的机器学习课程 **地址&#xff1a;**https://microsoft.github.io/ML-For-Beginners/#/ 学习经典机器学…

Mysql 下载与安装教程(详细介绍与总结)

一&#xff1a;版本介绍 首先&#xff0c;我们需要先进入官网进行下载&#xff0c;在官网中有好几个版本&#xff0c;那么这里我分别简述一下MySQL各个版本区别&#xff1a; 1&#xff1a;企业版&#xff0c;MySQL Enterprise Edition 需要付费的&#xff0c;可以免费试用30天…

超声波传感器(附:c语言测距代码)

一、引言 超声波传感器是一种利用超声波进行检测的装置&#xff0c;具有非接触、高精度、抗干扰能力强等优点。在工业自动化、医疗诊断、环境监测等领域&#xff0c;超声波传感器发挥着重要的作用。本文将深入探讨超声波传感器的原理、应用&#xff0c;并通过C语言代码示例来展…

Windows使用IIS服务搭建WebDAV站点结合内网穿透公网访问

文章目录 1. 安装IIS必要WebDav组件2. 客户端测试3. cpolar内网穿透3.1 打开Web-UI管理界面3.2 创建隧道3.3 查看在线隧道列表3.4 浏览器访问测试 4. 安装Raidrive客户端4.1 连接WebDav服务器4.2 连接成功4.2 连接成功总结&#xff1a; 自己用Windows Server搭建了家用NAS主机&…

ffmpeg与SDL结合使用

FFmpeg 使用了 SDL 库来处理音频和视频数据的显示。SDL 提供了一套跨平台的图形显示库&#xff0c;它可以在多个操作系统上提供硬件加速的视频输出功能&#xff0c;并且支持多种常用的视频编解码格式&#xff0c;这些特性使得它成为 FFmpeg 中的一个重要组件。 在 FFmpeg 中&a…

OpenGL FXAA抗锯齿算法(Qt,Quality版本)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 将FXAA添加到现有渲染器中很简单:它作为最终渲染通道[1]应用,仅将渲染图像作为输入,并输出抗锯齿版本。其主要思想是检测渲染图像中的边缘并使其平滑。这种方法快速有效,但会模糊纹理上的细节。该算法有两个版本…

汉诺塔问题

问题&#xff1a; Hanoi(汉诺)塔问题。这时一个古典的数学问题&#xff0c;是一个递归方法解题的典型例子。问题是这样的&#xff1a;古代有一个梵塔&#xff0c;塔内有3个座 A,B,C&#xff08;如下图&#xff09;。开始时A座上有64个盘子&#xff0c;盘子大小不等&#xff0c…

返利机器人的实现原理:从技术到收益的全面解析

返利机器人的实现原理&#xff1a;从技术到收益的全面解析 大家好&#xff0c;我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;在电商时代&#xff0c;许多消费者对返利机器人并不陌生。…

vue中使用lodash的debounce防抖函数

目录标题 第一步安装lodash第二步举例一个简单的例子&#xff1a; 防抖函数 debounce 指的是某个函数在某段时间内&#xff0c;无论触发了多少次回调&#xff0c;都只执行最后一次。假如我们设置了一个等待时间 3 秒的函数&#xff0c;在这 3 秒内如果遇到函数调用请求就重新计…