力扣(leetcode)刷题分享,简单题(第2期)

news2024/11/25 0:37:41

力扣

  • 第二期介绍
  • 1. 反转链表
  • 2. 移除链表元素
  • 3. 找链表的中间节点
  • 4. 寻找链表中的倒数第k个结点
  • 5. 合并两个有序链表
  • 总结

第二期介绍

本期博客主要讲解的题目是有关链表的一些经典OJ题,有一定难度,希望大家耐心看完。

1. 反转链表

题目介绍:
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
OJ链接
思路分析:定义一个新头,将原链表的元素依次头插致新头后面,最后返回新头。
时间复杂度:O(N)
图解:
在这里插入图片描述
代码实现:

struct ListNode* reverseList(struct ListNode* head)
{
    struct ListNode* rehead=NULL;//新头
    struct ListNode* cur=head;
    while(cur)//遍历链表
    {
        struct ListNode* tmp=cur;
        cur=cur->next;
        //头插
        tmp->next=rehead;
        rehead=tmp;
    }
    return rehead;
}

2. 移除链表元素

题目介绍:
给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回新的头节点 。
OJ链接
思路分析:
方法1:遍历数组,找到目标元素后将其删除。
时间复杂度:O(N^2)
该算法思路简单,但是效率较低,所以我们这里就不使用它了
方法2:声明一个新的头,遍历原链表,不为val就将原链表的元素尾插到新链表中。
时间复杂度:O(N)
图解:
在这里插入图片描述

代码实现:

struct ListNode* removeElements(struct ListNode* head, int val)
{
	//声明新头和新尾
	struct ListNode* newhead = NULL, * newtail = NULL;
	//遍历原链表
	struct ListNode* cur = head;
	while (cur)
	{
		//如果原链表的元素不为val就尾插到新链表中
		if (cur->val != val)
		{
			struct ListNode* tmp = cur;
			cur = cur->next;
			//新链表为空的情况
			if (newhead == NULL)
			{
				tmp->next = NULL;
				newtail = newhead = tmp;
			}
			//一般情况
			else
			{
				tmp->next = NULL;
				newtail->next = tmp;
				newtail = newtail->next;
			}
		}
		else
		{
			cur = cur->next;
		}
	}
	return newhead;
}

3. 找链表的中间节点

题目介绍:
给定一个头结点为 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。
OJ链接
思路:快慢指针。定义一对快慢指针,其中slow指针每次只走一步,fast指针每次走两步,当fast指针遍历完链表时,slow指针就停在链表中间了。
注意需要分类讨论链表结点个数为偶数还是奇数
图解:
请添加图片描述
请添加图片描述
代码实现:

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

4. 寻找链表中的倒数第k个结点

题目介绍:输入一个链表,输出该链表中倒数第k个结点。
OJ链接
思路分析:快慢指针。快指针先走k步,然后两个指针一起走,当快指针走到空时,慢指针就走到目标结点了。
图解:
请添加图片描述

代码实现:

struct ListNode* FindKthToTail(struct ListNode* pListHead, int k )
{
    struct ListNode* fast=pListHead,*slow=pListHead;
    //如果链表为空 直接返回NULL
    if(pListHead==NULL)
    {
        return NULL;
    }
    //快指针先走k步
    while(k)
    {
        //如果快指针已经为空了,但是k还不为0,说明k比链表总长度都大,直接返回NULL
        if(fast==NULL)
        {
            return NULL;
        }
        fast=fast->next;
        k--;
    }
    while(fast)
    {
        slow=slow->next;
        fast=fast->next;
    }
    return slow;
}

5. 合并两个有序链表

题目介绍:将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
OJ链接
思路分析:创建一个新头,将两个链表的元素依次对比,每次都将链表中较小(或者相等)的元素尾插到新头后,有一个链表为空时就停止对比,再将不为空的链表链接到新链表后。
图解:
请添加图片描述
代码实现:

  1. 不带表头版(比较麻烦)
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2)
{
    struct ListNode* newhead=NULL;
    struct ListNode* newtail=NULL;
    //判断特殊情况
    if(!list1)
    {
        return list2;
    }
    if(!list2)
    {
        return list1;
    }
    //只要有一个链表遍历完就退出循环
    while(list1&&list2)
    {
        if(list1->val<=list2->val)
        {
            struct ListNode* tmp=list1;
            list1=list1->next; 
            tmp->next=NULL;
            if(newhead==NULL)
            {
                newtail=newhead=newtail=tmp;
            }
            else
            {
                newtail->next=tmp;   
                newtail=newtail->next;
            }
        }
        else
        {
            struct ListNode* tmp=list2;
            list2=list2->next; 
            tmp->next=NULL;
            if(newhead==NULL)
            {
                newtail=newhead=newtail=tmp;
            }
            else
            {
                newtail->next=tmp;   
                newtail=newtail->next;
            }
        }
    }
    //循环结束后,将剩下的节点链接致新链表后面
    if(list1)
    {
        newtail->next=list1;
    }
    if(list2)
    {
        newtail->next=list2;
    }
    return newhead;
}
  1. 带表头版
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2)
{
    //申请表头
    struct ListNode* newhead=(struct ListNode*)malloc(sizeof(struct ListNode));
    newhead->next=NULL;
    struct ListNode* cur=newhead;
    while(list1&&list2)
    {
        if(list1->val<=list2->val)
        {
            cur->next=list1;
            list1=list1->next;
        }
        else
        {
            cur->next=list2;
            list2=list2->next;
        }
        cur=cur->next;
    }
    if(list1)
        cur->next=list1;
    if(list2)
        cur->next=list2;
    struct ListNode* tmp=newhead->next;
    free(newhead);
    return tmp;
}

总结

本期博客主要讲解了一些比较基础,简单的题目,感谢大家耐心看完,下一期会提升一点难度。大家加油!
在这里插入图片描述

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

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

相关文章

VUE Date类型前端判断动态校验

需求 原本需求 一个编号和一个日期在流程中的审查人节点必填&#xff0c;于是我就直接写了前端必填校验 所有代码和名称已做更改&#xff0c;不涉及到公司隐私 <CustomFormItem label"登记编号" prop"registerNo" v-if"asset_examiner form.node …

cleanmymac2023免费版纯净mac电脑系统管家

如今&#xff0c;我们在生活的方方面面都使用支持互联网的设备——查找信息、购物、银行、做作业、玩游戏&#xff0c;以及与朋友和家人保持联系。因此&#xff0c;我们的设备包含许多关于我们的个人信息。 此外&#xff0c;随着时间的推移&#xff0c;任何伟大的设备都会变得…

VIAVI唯亚威FFL-050/-100 可视故障定位仪

不管是进行安装还是故障排查&#xff0c;可视故障定位仪 (VFL) 都是快速、 方便定位光纤问题区域的必要工具。通过显示光纤损坏的准确位置&#xff0c; 技术人员能诊断、定位并有效地修复故障点。VFL 也可用于执行连接 性测试和光纤识别。 用于检查光纤弯曲和断裂、损伤位置和…

iNFTnews|Facebook、Twitter先后扑街,社交媒体的未来属于Web3?

最近埃隆马斯克&#xff08;Elon Musk&#xff09;收购推特的举动引发了热议。一方面&#xff0c;一些用户认为这位特立独行、做事说一不二的亿万富翁可以真正充分发挥平台的巨大潜力。但另外一部分人却因此担忧互联网未来的发展。 想想看&#xff0c;推特是世界上用户最多的社…

javaweb之会话技术

Cookie Cookie的基本使用 对于Cookie的使用&#xff0c;我们更关注的应该是后台代码如何操作Cookie&#xff0c;对于Cookie的操作主要分两大类&#xff0c;本别是发送Cookie和获取Cookie,对于上面这两块内容。 1、发送Cookie 创建Cookie对象&#xff0c;并设置数据 Cookie c…

6-1 邻接矩阵存储图的深度优先遍历

6-1 邻接矩阵存储图的深度优先遍历 分数 20 作者 DS课程组 单位 浙江大学 试实现邻接矩阵存储图的深度优先遍历。 函数接口定义&#xff1a; void DFS( MGraph Graph, Vertex V, void (*Visit)(Vertex) );其中MGraph是邻接矩阵存储的图&#xff0c;定义如下&#xff1a; t…

35岁互联网人只会被清退,是我听过最大的谎言

作为一个在测试行业摸爬滚打11年的老鸟&#xff0c;距离35岁还有两个月&#xff0c;目前在一家互联网公司担任 测试总监 的岗位。回看这些年的进阶之路&#xff0c;能做到今天的职位&#xff0c;关键的就是那几步。 而我认识的目前已失业和依然在做基层测试的同行&#xff0c;…

谷歌插件使用开发

谷歌插件 谷歌浏览器扩展程序&#xff1a;扩展是 Web 平台中使用的HTML、CSS、JavaScript、图像和其他文件的压缩包。可以修改用户浏览并与之交互中的web内容&#xff0c;它们还可以扩展和更改浏览器本身的行为。 开发核心 api 文档&#xff1a;link 插件主要是根据包内的mani…

mysql数据库主从同步

数据库版本 主&#xff1a;5.7.34 从&#xff1a;8.0.21 主数据库 修改mysql配置文件 my.ini&#xff08;windows&#xff09; 查看配置文件存在位置 -- 查看配置文件存在位置 show variables like %data%;修改内容 boo_db为同步的数据库名 server-id1log-binmysql-bin#目标…

手写一个单例模式,Demo,检测

手写一个单例模式&#xff0c;Demo&#xff0c;检测需求分析单例介绍一般情况DemoResult单例模式&#xff08;饿汉式—静态常量方式&#xff08;线程安全&#xff09;&#xff09;DemoResult懒汉式&#xff08;线程不安全&#xff09;DemoResult懒汉式&#xff08;加入锁机制&a…

K8s安装乐维5.0应用部署文档

乐维产品包具体打包为4个镜像包&#xff0c;分别为&#xff1a;mysql5.7.36.tar、zabbix_server.tar、itops_v1_4_x86_64.tar、bpm0.1.tar&#xff0c;对应的配置文件分别为&#xff1a;data.tar、conf.tar、nginx-v1.3.tar.gz、bpm12.zip。 K8s yaml文件具体打包为strogeclas…

[附源码]Python计算机毕业设计django学生学习评价与分析系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

数字逻辑·时序线路分析【触发器和时序线路分析方法】

课程目标 掌握触发器的特征表达式掌握触发器的激励表掌握触发器的状态表掌握时序线路分析方法 课程内容 D触发器 逻辑符号可以不画RD&#xff0c;SD&#xff0c;CP 上方&#xff1a;特征表达式&#xff1b;左下&#xff1a;激励表&#xff1b;右下&#xff1a;状态图 状态图…

list容器(20221117)

一、list容器 1、基本概念 功能&#xff1a;将数据进行链式存储 链表是一种物理存储单元上非连续的存储结构&#xff0c;数据元素的逻辑顺序是通过指针实现的 链表由一系列的节点组成&#xff1b; 节点的组成&#xff1a;一个是存储数据元素的数据域&#xff0c;另一个是存…

初探softmax

什么是softmax Softmax,又称作归一化指数函数。主要用于分类任务&#xff0c;降多分类的结果以概率的形式展现 下图展示softmax计算方法 softmax本质上是归一化网络&#xff0c;目的是将多个标量映射为一个概率分布,其输出的每一个值范围在&#xff08;0&#xff0c;1&#x…

使用 Next.js、 Prisma 和 PostgreSQL 全栈开发视频网站

通过上一篇文章&#xff0c;我们对乔巴乐高海报平台的整体架构有了初步的了解。今天我们深入到编辑器部分&#xff0c;对其中的难点和实现细节进行分析。 这是目前生产的编辑器页面&#xff1a; 不难看出和市面上大部分低代码平台一样&#xff0c;由三部分组成&#xff1a;左侧…

10名IB学生获得满分,新加坡环球印度国际学校成为一匹黑马

近年来留学人数大幅度上升&#xff0c;其中新加坡因多元的文化环境、健全的教育制度&#xff0c;深受学生、家长青睐喜爱&#xff0c;新加坡国际学校也因此成为了香饽饽。 在每年的IB成绩放榜中&#xff0c;新加坡国际学校IB表现都非常亮眼。 除了我们熟悉的华中、德威、UWC等一…

宏记录器 Macro Recorder 2.0 注册版

记录鼠标和键盘操作以无限重播...... 不再执行相同的任务两次&#xff01; Macro Recorder 像录音机一样捕捉鼠标事件和击键&#xff0c;让您在计算机上自动执行繁琐的程序。 按记录。执行操作。 Macro Recorder 记录您的鼠标移动、鼠标点击和键盘输入。就像电脑的录音机一样。…

RabbitMQ第四个实操小案例——DirectExchange

文章目录RabbitMQ第四个实操小案例——DirectExchangeRabbitMQ第四个实操小案例——DirectExchange DirectExchange&#xff1a;这种交换机的模式跟前面的Fouout&#xff08;广播&#xff09;不太一样&#xff0c;DirectExchange 会将接收到的消息根据规则路由到指定的Queue&a…

(免费分享)基于springboot,vue毕业设计管理系统

源码获取&#xff1a;关注文末gongzhonghao&#xff0c;输入011领取下载链接 开发工具IDEA ,数据库mysql5.7 &#xff0c;前后端分离 系统分学生、教师、管理员三个角色 1.学生截图 2.教师截图&#xff1a; 3.管理员截图&#xff1a; package com.cx.controller;import cn.…