三板斧解决leetcode的链表题

news2024/11/17 6:41:23

在《波奇学单链表》中我们提到单链表的两个特点

  1. 单向性。

  1. 头节点尾节点的特殊性导致分类讨论的情况。

如何看单链表?

让我们简化成下图

cur表示当前节点,下图表示cur移动,圆圈表示值

用哨兵卫节点(新的头节点)和把尾节点看成NULL来把头尾节点一般化。

struct ListNode*guard_h=(struct ListNode*)malloc(sizeof(struct ListNode));
struct ListNode*cur=guard_h;//作为移动节点

相当于有了头节点的前驱节点,可以cur->next=cur->next->next;循环

删除尾节点不用cur->next=NULL(cur是4的地址)直接cur->next=cur->next->next;

简化代码,但要注意释放开辟的空间,避免内存泄露。

快慢指针

创建两个指针一快一慢。

快慢指针找链表的中间节点:leetcode 876.链表中间节点

struct ListNode*fast=head,*slow=head;
int count=0;
while(fast)
{
    fast=fast->next;
    count++;
    if(count%2==0)
    {
        slow=slow->next;
    }
}
return slow;//结束时fast为空,slow为中间节点的右边节点

变式:求中间节点的左节点(如1-2-3-4求2)

fast走的节点数=总节点数,fast和slow指针走的节点数如图。

struct ListNode*fast=head,*slow=head;
int count=0;
while(fast)
{
    fast=fast->next;
    count++;
    if(count%2==1&&count>=3)
    {
        slow=slow->next;
    }
}
return slow;//结束时fast为空,slow为中间节点的左边节点

反转链表

leetcode:反转单链表

struct ListNode* reverseList(struct ListNode* head) {
    struct ListNode* newhead = NULL;
    struct ListNode* cur = head;
    while(cur)
    {
        //next指针指向cur的下个节点
        struct ListNode* next = cur->next;
        cur->next = newhead;
        newhead = cur;
        cur = next;
    }

合并有序链表

leetcode:合并有序链表

思路:不要试图在原链表中进行插入操作,再开一个新的头节点,把原来链表的值拿过来链接。

用哨兵节点可以简化代码,短的拼完后,再把剩下的链接在一起就行。


struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2){
   struct ListNode*cur=(struct ListNode*)malloc(sizeof(struct ListNode));
   cur->next=NULL;
   cur->val=0;
   struct ListNode*head=cur;
    while(list1&&list2)
    {
        if(list1->val>list2->val)
        {
            head->next=list2;
            list2=list2->next;
        }
        else
        {
            head->next=list1;
            list1=list1->next;
        }
        head=head->next;
    }
    struct ListNode*list3=(list1!=NULL?list1:list2);
        while(list3)
        {
            head->next=list3;
            list3=list3->next;
            head=head->next;
        }
    return cur->next;
}

合并链表,快慢指针,以及链表逆序这三板斧掌握了就可以解决leetcode上大部分的链表题。

示例:链表排序

思路:快慢指针找中间节点,再用中间节点不断分割,分割到只有一个节点或空链表。

一节点链表进行合并有序链表,最后把新链表再进行合并有序直到所有链表都合并完成。

总而言之,最基础就是这三个。

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

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

相关文章

spring的beanfactory与applicationContext的区别以及继承关系

applicationContext继承关系 首先可以看一张图 ListableBeanFactory 可列举的bean工厂 hierarchical 分层bean工厂 messageSource 国际化信息 //国际化(internationalization)是设计和…

1.2 绝对误差、相对误差与有效数字

1.2.1 绝对误差和绝对误差限若x*为准确值x的一个近似值,则称 x-x*为近似值x*的绝对误差,简称误差,并用e*(x)表示,即e*(x)x-x*绝对误差虽然能清楚地表明近似值,与准确值,之间的差异,但是在实际问题中,往往无法知道准确值…

2023年3月全国数据治理工程师认证DAMA-CDGA/CDGP考试怎么通过?

弘博创新是DAMA中国授权的数据治理人才培养基地,贴合市场需求定制教学体系,采用行业资深名师授课,理论与实践案例相结合,快速全面提升个人/企业数据治理专业知识与实践经验,通过考试还能获得数据专业领域证书。 DAMA认…

【ElasticSearch】(一)—— 初识ES

文章目录1. 了解ES1.1 elasticsearch的作用1.2 ELK技术栈1.3 elasticsearch和lucene1.4 为什么不是其他搜索技术?1.5 总结2. 倒排索引2.1 正向索引2.2 倒排索引2.3 正向和倒排3. ES的一些概念3.1 文档和字段3.2 索引和映射3.3 mysql与elasticsearch1. 了解ES Elasti…

TypeScript深度剖析:TypeScript 中高级类型的理解?有哪些?

一、是什么 除了string、number、boolean 这种基础类型外,在 typescript 类型声明中还存在一些高级的类型应用 这些高级类型,是typescript为了保证语言的灵活性,所使用的一些语言特性。这些特性有助于我们应对复杂多变的开发场景 二、有哪…

MQTT协议-发布消息(服务器向客户端发送)

MQTT协议-发布消息(服务器向客户端发送) 发布消息报文组成:https://blog.csdn.net/weixin_46251230/article/details/129414158 在了解了发布信息的PUBLISH报文后,就可以分析出阿里云服务器向本地客户端发送的报文数据了 实验前…

博客项目

文章目录1. 创建项目2. 数据库设计3. 前置任务3.1 拦截器3.2 统一数据格式3.3 创建一个 Constant3.4 统一异常处理3.5 密码加密4. 功能实现4.1 登录功能4.2 注册功能4.3 博客列表页 (功能实现)4.3.1 左侧框4.3.2 右侧框 (分页功能 页面显示)4.4 博客详情…

【Redis】搭建主从集群

目录 集群结构 准备实例和配置 启动 开启主从关系 测试 集群结构 我们搭建的主从集群结构如图: 共包含三个节点,一个主节点,两个从节点。 这里我们会在同一台虚拟机中开启3个redis实例,模拟主从集群,信息如下&…

51单片机DS18B20的使用

文章目录前言一、DS18B20介绍二、单总线协议三、DS18B20引脚说明四、DS18B20程序编写1.DS18B20复位函数2.DS18B20存在检测3.DS18B20读取一个bit和一个byte函数4.DS18B20写一个字节函数5.开始温度转换函数6.DS18B20初始化函数7.DS18B20读取温度函数五、代码测试总结前言 本篇文…

ERP系统哪家比较好?

ERP系统哪家好?在选择ERP系统时,我们可以按照这三个维度,然后再按照需求去选择ERP系统。 市面上ERP软件大概可以分为三大类: ① 标准ERP应用:功能比较固定,难以满足个性化需求,二次开发难度很高…

MySQL对表操作

结束了上一章内容,我们对数据库的操作有一定的了解,本章内容就是针对表中的数据进行操作的。 针对表中数据的操作绝大部分都是增删改查(CRUD),CRUD也就是四个单词的缩写: 增加(Create)、查询(Retrieve)、…

基于微前端qiankun的tab切换

文章目录背景主应用要做的1、新建tab组件2、引入组件3、tabs.js核心4、开始使用子应用要做的1、将父应用传给子应用的props挂载在Vue对象上2、创建核心逻辑3、将核心逻辑混入到App.vue注意事项分析zy/qiankun-tabs源码index.jsactions.jstabs.js最终效果背景 我们的平时做后台…

1.1 误差的来源

不难发现,考察用计算机解决科学计算问题时所经历的几个环节(如图1-1所示),其中每一步都可能产生误差,首先,数学模型是通过对实际问题进行抽象与简化得到的,它与实际问题之间有误差.数学模型与实…

Nginx 是如何进化到 kong 的

Nginx 是如何进化到 kong 的 在传统的互联网服务中,对网关的主要诉求就是反向代理、负载均衡、路由等基础功能。 一个经典的业务的架构图一般是采用四层 LVS 做 对外 IP 收敛,在七层采用 Nginx 来负责七层 HTTPS 协议接入,反向代理、负载均衡、路由。 Nginx 的每个 Worker…

DevOps工具集合

简介 DevOps(Development和Operations的组合词)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。 它是一种重视“软件开…

近红外染料IR-825,IR-825 Maleimide,IR-825 Mal,IR-825马来酰亚胺

中文名称:荧光染料IR 825马来酰亚胺,近红外染料IR-825马来酰亚胺英文名称:IR825 Maleimide,IR-825 Maleimide,IR 825 Maleimide,IR825 Mal,IR-825 Mal试剂规格:10mg,25mg…

算法小抄5-原地哈希

书接上回,学会了数组中重复数字的解法三,相信接下来的题也难不倒你 找到数组中消失的数字 题目链接 题意 对于一个大小为n的数组,数组中所有的数都在[1,n]内,其中有些数字重复了,由于有些数字重复了,另一些数字就一定会确实,这次需要找到所有缺少的数字并且返回结果 有没有发…

反转链表相关的练习(上)

目录 一、反转链表 二、反转链表 || 三、两两交换链表中的结点 四、K 个一组翻转链表 一、反转链表 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示例 1: 输入:head [1,2,3,4,5] 输出:[5,4,3,…

ip-guardip-guard如何通过准入网关对指定的服务器进行通讯加密保护?

1、准入网关在高级配置设置受保护服务器; WEB管理界面【系统工具】,点击【配置管理】,点击参数设置,进入高级配置界面,输入配置内容即可。 [ControlServer]

使用阈值图修改角色脸部阴影

大家好,我是阿赵。 之前介绍了通过修改模型顶点法线的方法,来解决角色模型脸部光影问题。这里再顺便介绍一下第二种方法,使用阈值图修改角色脸部阴影 一、角色脸部光影的问题 这个问题之前讨论过,由于角色脸部法线复杂&#xff0…