leetcode No.21 合并两个有序链表

题目

链接:https://leetcode-cn.com/problems/merge-two-sorted-lists

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

示例:

输入:1->2->4, 1->3->4

输出:1->1->2->3->4->4

C++代码

解法1

一个最简单的思路,新建一个指针p

将p->next指向l1和l2所指元素中较小的那个,并将对应的指针l1或l2后移

重复上面的过程直至l1或l2为NULL,将剩余部分接到p上面即可

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode(int x) : val(x), next(NULL) {}* };*/
class Solution {
public:ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {if(l1 == NULL) return l2;if(l2 == NULL) return l1;ListNode* head = new ListNode(0);ListNode* pi = head;// l1,l2一直向后遍历元素,向head中按序插入,直至l1或l2为NULLwhile(l1 && l2){if(l1->val < l2->val){pi->next = l1;l1 = l1->next;pi = pi->next;}else{pi->next = l2;l2 = l2->next;pi = pi->next;}}// l1或l2为NULL,此时将不会空的链表接到最后即可pi->next = l1 ? l1 : l2;return head->next;}
};

执行用时: 12ms, 在所有 C++ 提交中击败了 41.17% 的用户

内存消耗: 16.8MB, 在所有 C++ 提交中击败了 5.07% 的用户

不知道大家是否能够看出上面的代码中的问题

这个问题说小不小,说大也蛮严重,我们生成的头节点不再被我们所维护,没有任何的指针指向它,也就是发生了内存泄漏。

因此我们将代码进行一些修改:

class Solution {
public:ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {if(l1 == NULL) return l2;if(l2 == NULL) return l1;ListNode* head;if (l1->val < l2->val){head = l1;l1 = l1->next;}else{head = l2;l2 = l2->next;}ListNode* pi = head;// l1,l2一直向后遍历元素,向head中按序插入,直至l1或l2为NULLwhile(l1 && l2){if(l1->val < l2->val){pi->next = l1;l1 = l1->next;pi = pi->next;}else{pi->next = l2;l2 = l2->next;pi = pi->next;}}// l1或l2为NULL,此时将不会空的链表接到最后即可pi->next = l1 ? l1 : l2;return head;}
};

解法2:递归

另一种很巧妙的方法是递归

我们让函数只处理好当前l1和l2节点的大小关系,后面的排序通过递归的调用自己求解一个子问题来完成。

class Solution {
public:ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {if (l1 == NULL) {return l2;}if (l2 == NULL) {return l1;}if (l1->val <= l2->val) {l1->next = mergeTwoLists(l1->next, l2);return l1;}l2->next = mergeTwoLists(l1, l2->next);return l2;}
};

两种方法耗时基本一致,第一种更直观,第二种方法更巧妙。

Python3代码

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = Noneclass Solution:def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:if l1 and l2:if l1.val > l2.val: l1, l2 = l2, l1l1.next = self.mergeTwoLists(l1.next, l2)return l1 or l2

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

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

相关文章

Modbus协议栈开发笔记之八:Modbus ASCII Master开发

这一节我们来封装Modbus ASCII Master应用&#xff0c;Modbus ASCII主站的开发与RTU主站的开发是一致的。同样的我们也不是做具体的应用&#xff0c;而是实现ASCII主站的基本功能。我们将ASCII主站的功能封装为函数&#xff0c;以便在开发具体应用时调用。 对于ASCII主站我们主…

leetcode No.83 删除排序链表中的重复元素

题目 链接&#xff1a;https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list 给定一个排序链表&#xff0c;删除所有重复的元素&#xff0c;使得每个元素只出现一次。 示例 1: 输入: 1->1->2 输出: 1->2 示例 2: 输入: 1->1->2->3-&…

在Eclipse中使用Git

本文原文出自MCU on Eclipse网站&#xff0c;作者为Erich Styger&#xff0c;原文网址&#xff1a;https://mcuoneclipse.com/2018/09/30/tutorial-git-with-eclipse/。本人翻译了此篇文章&#xff0c;有些短语难以找到准确表达的中文词语&#xff0c;所以保持了原文。限于个人…

leetcode No.141 环形链表

题目 链接&#xff1a;https://leetcode-cn.com/problems/linked-list-cycle 给定一个链表&#xff0c;判断链表中是否有环。 为了表示给定链表中的环&#xff0c;我们使用整数 pos 来表示链表尾连接到链表中的位置&#xff08;索引从 0 开始&#xff09;。 如果 pos 是 -1&…

C语言学习及应用笔记之三:C语言const关键字及其使用

在C语言程序中&#xff0c;const关键字也是经常会用到的一个关键字&#xff0c;那么使用const关键字的目的是什么呢&#xff1f;事实上&#xff0c;在程序中使用const关键字的主要目的就是为了向使用者传递设计者的一些意图。 事实上&#xff0c;无论我们是使用const关键字声明…

leetcode No.2 两数相加

题目 链接&#xff1a;https://leetcode-cn.com/problems/add-two-numbers 给出两个 非空 的链表用来表示两个非负的整数。其中&#xff0c;它们各自的位数是按照 逆序 的方式存储的&#xff0c;并且它们的每个节点只能存储 一位 数字。 如果&#xff0c;我们将这两个数相加…

nlp cs224n 学习笔记1 Introduction and Word Vectors

注&#xff1a;个人笔记&#xff0c;价值有限&#xff0c;不建议逗留。 word embedding 的意义和目的&#xff1f; 通过一种映射&#xff0c;将自然语言中的单词&#xff0c;嵌入到n维欧式空间中&#xff0c;得到可以用数学语言表达并用计算机计算的“词向量”。 同时我们希望…

Modbus协议栈开发笔记之一:实现功能的基本设计

Modbus作为开放式的工业通讯协议&#xff0c;在各种工业设备中应用极其广泛。本人也使用Modbus通讯很多年了&#xff0c;或者用现成的&#xff0c;或者针对具体应用开发&#xff0c;一直以来都想要开发一个比较通用的协议栈能在后续的项目中复用&#xff0c;而不必每次都写一遍…

天池CV学习赛:街景字符识别-思路与上分技巧汇总

Datawhale 和 天池 合作的零基础入门CV - 街景字符编码识别比赛的正式赛已经结束。本文对一些比赛思路和上分技巧进行了汇总和整理&#xff0c;希望对大家深入学习CV能够有帮助。 本文分为以下几部分&#xff1a; 如何优化官方baseline的效果&#xff1f; 其它解题思路的整理…

Modbus协议栈开发笔记之二:Modbus消息帧的生成

前面我们已经对Modbus的基本事务作了说明&#xff0c;也据此设计了我们将要实现的主从站的操作流程。这其中与Modbus直接相关的就是Modbus消息帧的生成。Modbus消息帧也是实现Modbus通讯协议的根本。 1、Modbus消息帧分析 MODBUS协议在不同的物理链路上的消息帧有一些差异&am…

动手学CV-目标检测入门教程:基本概念

3.1 目标检测基本概念 本文来自开源组织 DataWhale &#x1f433; CV小组创作的目标检测入门教程。 对应开源项目 《动手学CV-Pytorch》 的第3章的内容&#xff0c;教程中涉及的代码也可以在项目中找到&#xff0c;后续会持续更新更多的优质内容&#xff0c;欢迎⭐️。 如果使…

动手学CV-目标检测入门教程2:VOC数据集

3.2 目标检测数据集VOC 本文来自开源组织 DataWhale &#x1f433; CV小组创作的目标检测入门教程。 对应开源项目 《动手学CV-Pytorch》 的第3章的内容&#xff0c;教程中涉及的代码也可以在项目中找到&#xff0c;后续会持续更新更多的优质内容&#xff0c;欢迎⭐️。 如果…

C语言学习及应用笔记之四:C语言volatile关键字及其使用

在C语言中&#xff0c;还有一个并不经常使用但却非常有用的关键字volatile。那么使用volatile关键字究竟能干什么呢&#xff1f;接下来我将就此问题进行讨论。 一个使用volatile关键字定义变量&#xff0c;其实就是告诉编译系统这变量可能会被意想不到地改变。那么编译时&…

Modbus协议栈开发笔记之三:Modbus TCP Server开发

在完成了前面的工作后&#xff0c;我们就可以实现有针对性的应用了&#xff0c;首先我们来实现Modbus TCP的服务器端应用。当然我们不是做具体的应用&#xff0c;而是对Modbus TCP的服务器端应用进行封装以供有需要时调用。 这里我们不涉及TCP的协议&#xff0c;这部分与Modbu…

动手学CV-目标检测入门教程3:锚框(anchor)

3.3 锚框 or 先验框 本文来自开源组织 DataWhale &#x1f433; CV小组创作的目标检测入门教程。 对应开源项目 《动手学CV-Pytorch》 的第3章的内容&#xff0c;教程中涉及的代码也可以在项目中找到&#xff0c;后续会持续更新更多的优质内容&#xff0c;欢迎⭐️。 如果使…

动手学CV-目标检测入门教程4:模型结构

3.4 模型结构 本文来自开源组织 DataWhale &#x1f433; CV小组创作的目标检测入门教程。 对应开源项目 《动手学CV-Pytorch》 的第3章的内容&#xff0c;教程中涉及的代码也可以在项目中找到&#xff0c;后续会持续更新更多的优质内容&#xff0c;欢迎⭐️。 如果使用我们…

PID控制器开发笔记之十二:模糊PID控制器的实现

在现实控制中&#xff0c;被控系统并非是线性时不变的&#xff0c;往往需要动态调整PID的参数&#xff0c;而模糊控制正好能够满足这一需求&#xff0c;所以在接下来的这一节我们将讨论模糊PID控制器的相关问题。模糊PID控制器是将模糊算法与PID控制参数的自整定相结合的一种控…

动手学CV-目标检测入门教程5:损失函数

3.5 损失函数 本文来自开源组织 DataWhale &#x1f433; CV小组创作的目标检测入门教程。 对应开源项目 《动手学CV-Pytorch》 的第3章的内容&#xff0c;教程中涉及的代码也可以在项目中找到&#xff0c;后续会持续更新更多的优质内容&#xff0c;欢迎⭐️。 如果使用我们…

Modbus协议栈开发笔记之四:Modbus TCP Client开发

这一次我们封装Modbus TCP Client应用。同样的我们也不是做具体的应用&#xff0c;而是实现TCP客户端的基本功能。我们将TCP客户端的功能封装为函数&#xff0c;以便在开发具体应用时调用。 对于TCP客户端我们主要实现的功能有两个&#xff1a;其一是生成访问TCP服务器的命令&…

动手学CV-目标检测入门教程6:训练与测试

3.6、训练与测试 本文来自开源组织 DataWhale &#x1f433; CV小组创作的目标检测入门教程。 对应开源项目 《动手学CV-Pytorch》 的第3章的内容&#xff0c;教程中涉及的代码也可以在项目中找到&#xff0c;后续会持续更新更多的优质内容&#xff0c;欢迎⭐️。 如果使用我…