趣说数据结构(练习1) —— 顺序表/链表力扣刷题

news2024/10/5 22:24:25

练习 1 —— 顺序表/链表力扣刷题

1. 合并两个有序链表

力扣题目地址:https://leetcode.cn/problems/merge-two-sorted-lists/

问题描述:将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
在这里插入图片描述

解题思路:

  1. 给定的是一个有序列表,因此不需要重新排序;
  2. 典型的双指针问题,不过此处的双指针分别指两个链表的对应的指针;

解题方法一:

此份代码是通过创建一个新的链表分别存储两个链表组合后的结果。这个方法比较简单,简单来说就是两个步骤,第一步逐个比较,你们俩谁小,谁小就移动谁的指针;第二步收尾,还有谁有剩余的存库,快快交出来。

这份代码是比较 low 的,因为它需要额外开销空间,并且代码看起来多少有点不够美观。

class Solution {
public:
    ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
        ListNode* result = new ListNode(-1);
        ListNode* point = result;
        while(list1 != nullptr && list2 != nullptr) {
            if(list1->val <= list2->val) {
                point->next = list1;
                list1 = list1->next;
            } else {
                point->next = list2;
                list2 = list2->next;
            }
            point = point->next;
        }
        if (list1 != nullptr) {
            point->next = list1;
        }
        if (list2 != nullptr) {
            point->next = list2;
        } 
        return result->next;
    }
};

解题方法二:

以下代码来自官方文档
作者:LeetCode-Solution
链接:https://leetcode.cn/problems/merge-two-sorted-lists/solution/he-bing-liang-ge-you-xu-lian-biao-by-leetcode-solu/

class Solution {
public:
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
        if (l1 == nullptr) {
            return l2;
        } else if (l2 == nullptr) {
            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;
        }
    }
};

比较的简洁美观,看起来也比较舒服,除了 l1l2 这种不太科学的变量命名,读起来还是非常的简单。

  1. 排除二者存在空的情况;
  2. 递归解决问题,每次递归只解决一个问题;
  3. 每次递归返回的数据都是已经完成 “部分合并” 后的结果。

坏处:此份代码使用递归需要申请额外的栈存储空间。

2. 删除排序链表中的重复元素

力扣原题地址:https://leetcode.cn/problems/remove-duplicates-from-sorted-list/

题目描述:给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。

题目的示例:
在这里插入图片描述

输入:head = [1,1,2]
输出:[1,2]

问题分析:抓住关键字:已经排序的链表。

接下来的时间就简单了,我们用一个指针p,不要轻易移动,只有遇到 “与自己不一样” 的小伙伴才移动,自己才能变成它,最终就绕开了重复的元素,实现了去重的目的。

解题方法一:


class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) {
        if (!head) {
            return head;
        }

        ListNode* now = head;
        while (now -> next) {
        	// 如果遇到的和自己相等,就绕开它到它的next
            if (now -> val == now -> next->val) {
                now -> next = now -> next->next;
            } else {
                // 不一样就保留它,加到自己的队伍
                now = now -> next;
            }
        }

        return head;
    }
};

这个解题方法比较简单,也未申请额外的存储空间,所以时间复杂度为 O ( n ) O(n) O(n),而空间复杂度为 O ( 1 ) O(1) O(1)

3. 反转链表

题目描述

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

示例

在这里插入图片描述

代码实现 1

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        ListNode* result = new ListNode();
        ListNode* p = result;
        while (head != nullptr) {
            ListNode* q = new ListNode(head -> val);
            q -> next = p -> next;
            p -> next = q;
            head = head -> next;
        }

        return result -> next;
    }
};

时间复杂度:O(n)

空间复杂度:O(n)

时间复杂度已经无法降低,空间复杂度应当有改善空间,如下所示:

代码实现 2

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        ListNode* prev = nullptr;
        ListNode* curr = head;
        while (curr != nullptr) {
            ListNode* next = curr -> next;
            curr -> next = prev;
            prev = curr;
            curr = next;
        }
        return prev;
    }
};

时间复杂度:O(n)

空间复杂度:O(1)

这个地方有疑问的小伙伴可以尝试先返回 curr,输出的结果是 [ ],也就是说,之所以能够节省空间,只是我们使用两个指针移来移去的,这里我们绘制一个简单图片描述一下。

在这里插入图片描述
第一步,next = curr -> next 记录一下当前结点的下个结点的位置;
第二步,curr -> next = prev 当前结点指向的下一个结点等于 prev,请看图片中的下面一行图片,也就是说这个时候 prev 准备挪到 2 那个位置了,我们先把 curr -> next = prev,然后 prev = curr,这个时候对应的 prev 已经指向了 2 的位置;
第三步,curr = next,把 curr 拉回正轨。因为刚刚出去协助 prev 指针了,所以这里把它拉回来。

循环前面的步骤,即可完成链表的反转。归根结蒂就是利用指针的灵活性,反过来再写一遍。

有点迷糊

总结

本章的练习部分算是 “小试牛刀”,两个非常简单的题目,用来练练手感受一下使用指针 -> 挪动数据的方法。

Smileyan
2023.04.30 00:25

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

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

相关文章

【云计算•云原生】4.云原生之什么是Kubernetes

文章目录 Kubernetes概念Kubernetes核心概念集群podConfigMap Kubernetes架构master节点的组件worker节点组件 Kubernetes网络架构内部网络外部网络 k8s各端口含义 Kubernetes概念 K8S就是Kubernetes&#xff0c;Kubernetes首字母为K&#xff0c;末尾为s&#xff0c;中间一共有…

全球5G市场最新进展及未来展望

从智慧医疗到万物互联&#xff0c;从无人驾驶到关乎我国未来发展的“新基建”&#xff0c;自2019年全球5G商用启动后&#xff0c;5G就步入了发展“快车道”;2022年继续保持快速稳定的增长态势&#xff0c;在网络建设、人口覆盖、终端形态等方面发展势头强劲&#xff0c;在技术标…

1695_week2_算法与函数(MIT使用Python编程学习手记)

全部学习汇总&#xff1a; GreyZhang/python_basic: My learning notes about python. (github.com) 首先说明一下&#xff0c;这部分信息的整理只是我个人的理解。由于自己的知识功底以及英语水准&#xff0c;很可能会有大量的疏漏。再此&#xff0c;我只想把自己学习时候的一…

C++(类和对象上篇)

本节目标&#xff1a; 1.面向过程和面向对象初步认识 2.类的引入 3.类的定义 4.类的访问限定符及封装 5.类的作用域 6.类的实例化 7.类的对象大小的计算 8.类成员函数的this指针 目录 1、面向过程和面向对象初步认识 2、类的引入 4.类的访问限定符及封装 4.1访问限定…

为了做低代码平台,这些年我们对.NET的DataGridView做的那些扩展

我们的低代码开发平台从一开始决定做的时候&#xff0c;就追求未来能够支持多种类型的客户端&#xff0c;目前支持Winform&#xff0c;Web&#xff0c;H5&#xff0c;FlutterAPP&#xff0c;当然了&#xff0c;未来也有可能会随着实际的需要淘汰掉一些客户端的。 为了系统更易…

springboot - 实现动态刷新配置

自定义的配置数据源&#xff0c;继承自Spring框架的 MapPropertySource 类&#xff0c;从一个名为 my.properties 的文件中读取配置信息&#xff0c;并在每10秒钟刷新一次。 这里不加Component&#xff0c;是因为&#xff1a; FilePropertiesSource filePropertiesSource new…

辨析 总结PMP各种BS结构

OBS 组织分解结构、BOM 物料清单、WBS工作分解结构、RBS 资源分解结构、RBS 风险分解结构、RAM 责任分匹配矩阵辨析 组织分解结构 OBS&#xff08;Organizational Breakdown Structure&#xff09; 描述了执行组织的层次结构&#xff0c;以便把工作包同执行组织单元相关联 物料…

电子邮件SDK:MailBee.NET 12.3.1 Crack

MailBee.NET 对象捆绑包包括SMTP、POP3、IMAP、EWS、安全、反垃圾邮件、Outlook 转换器、地址验证器、PDF组件以及BounceMail、HTML、MIME、ICalVCard组件&#xff0c;这些组件是一项常用功能。 MailBee.NET Objects是一组强大且功能丰富的 .NET 组件&#xff0c;用于创建、发送…

Haffman编码(算法导论)

上次算法导论课讲到了Haffman树&#xff0c;笔者惊叹于Haffman编码的压缩效果&#xff0c;故想自己亲自动手尝试写一个极简的Haffman压缩程序。 首先&#xff0c;我们来了解一下什么是Haffman编码 Haffman编码 赫夫曼编码可以很有效地压缩数据&#xff1a;通常可以节省20%&am…

UNIX环境高级编程——进程关系

9.1 引言 本章详细说明进程组以及会话的概念&#xff0c;还将介绍登录shell&#xff08;登录时所调用的&#xff09;和所有从登录shell启动的进程之间的关系。 9.2 终端登录 9.3 网络登录 9.4 进程组 每个进程除了有一进程ID之外&#xff0c;还属于一个进程组&#xff0c;进…

一曲微茫度余生 ——川剧《李亚仙》唱响香港西九戏曲中心

2023年4月28日晚&#xff0c;香港西九戏曲中心灯火辉煌。重庆市川剧院携手成都市川剧研究院带来的川剧《李亚仙》首场演出在这个为戏曲而设的世界级舞台重磅上演。 此次访演受香港西九戏曲文化中心的邀请&#xff0c;原重庆市文化和旅游发展委员会党委书记、主任刘旗带队&…

『LogDashboard』.NET开源的日志面板——登录授权页面扩展

&#x1f4e3;读完这篇文章里你能收获到 了解LogDashboard扩展开源项目——LogDashboard.Authorization掌握LogDashboard扩展内置登录页的使用方式 文章目录 一、LogDashbaord介绍1. 功能支持2. 快速开始 二、LogDashboard.Authorization1. 功能介绍2. 项目接入3. 更多示例 一…

Python语法学习

目录 Openmv用micro python开发的原因 print函数 列表 元组 判断 if...else... if...elif...else 循环 for循环 while循环 强制类型转换 点灯之路 点个不同颜色的闪烁LED 本文章仅作为个人的Openmv学习笔记&#xff0c;有问题欢迎指正~ Openmv用micro python开发…

【MPC|云储能】基于模型预测控制(MPC)的微电网调度优化的研究(matlab代码)

目录 1 主要内容 2 程序难点及问题说明 3 部分程序 4 下载链接 1 主要内容 该程序分为两部分&#xff0c;日前优化部分——该程序首先根据《电力系统云储能研究框架与基础模型》上面方法&#xff0c;根据每个居民的实际需要得到响应储能充放电功率&#xff0c;优化得到整体…

性能测评:阿里云服务器ECS通用型g8i实例CPU内存安全存储

阿里云服务器ECS通用型实例规格族g8i采用2.7 GHz主频的Intel Xeon(Sapphire Rapids) Platinum 8475B处理器&#xff0c;3.2 GHz睿频&#xff0c;g8i实例采用阿里云全新CIPU架构&#xff0c;可提供稳定的算力输出、更强劲的I/O引擎以及芯片级的安全加固。阿里云百科分享阿里云服…

真题详解(DNS)-软件设计(六十三)

真题详解&#xff08;有向图&#xff09;-软件设计&#xff08;六十二)https://blog.csdn.net/ke1ying/article/details/130443040 顺序存储&#xff1a;元素和存储空间相对位置来表示数据元素之间逻辑关系。 RFB&#xff1a;远程访问图形用户界面的简单协议。 在ISO/IEC9126软…

【五一创作】跑alpaca-lora语言模型的常见问题(心得)

训练部署alpaca-lora语言模型常见问题 Alpaca-Lora是一个开源的自然语言处理框架&#xff0c;使用深度学习技术构建了一个端到端的语言模型。在训练和部署alpaca-lora语言模型时&#xff0c;可能会遇到一些常见问题。本文将介绍一些这些问题及其解决方法。 1. bitsandbytes版…

计算机视觉毕业后找不到工作怎么办?怒刷leetcode,还是另寻他路?

文章目录 一、计算机视觉毕业后找不到工作怎么办&#xff1f;二、大环境&#xff1a;前两年的泡沫太大三、还是要把自己的基本功搞扎实&#xff0c;真正的人才什么时候都紧缺四、转换思路&#xff0c;另投他坑五、要有毅力&#xff0c;心态放平六、最后的建议 一、计算机视觉毕…

Python毕业设计之django社区报修维修预约上门服务系统

开发语言&#xff1a;Python 框架&#xff1a;django Python版本&#xff1a;python3.7.7 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat 开发软件&#xff1a;PyCharm 目 录 摘 要 I Pick to II 1绪论 1 1.1项目研究的背景 1 1.2开发意义 1 1.3项…

「数据架构」介绍下一代主数据管理(MDM)

主数据管理是旨在创建和维护权威、可靠、可持续、准确、及时和安全的环境的过程和技术框架。这个环境代表了一个单一版本的事实&#xff0c;作为跨不同的系统、业务单元和用户社区的可接受的记录系统。 尽管MDM不是新的&#xff0c;但是最近人们对开发MDM解决方案的兴趣大增。这…