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

2024-06-12 14:48

本文主要是介绍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

这篇关于leetcode No.21 合并两个有序链表的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1054523

相关文章

pandas批量拆分与合并Excel文件的实现示例

《pandas批量拆分与合并Excel文件的实现示例》本文介绍了Pandas中基于整数位置的iloc和基于标签的loc方法进行数据索引和切片的操作,并将大Excel文件拆分合并,具有一定的参考价值,感... 目录一、Pandas 进行索引和切编程片的iloc、loc方法二、Pandas批量拆分与合并Exce

Redis中的有序集合zset从使用到原理分析

《Redis中的有序集合zset从使用到原理分析》Redis有序集合(zset)是字符串与分值的有序映射,通过跳跃表和哈希表结合实现高效有序性管理,适用于排行榜、延迟队列等场景,其时间复杂度低,内存占... 目录开篇:排行榜背后的秘密一、zset的基本使用1.1 常用命令1.2 Java客户端示例二、zse

C#实现一键批量合并PDF文档

《C#实现一键批量合并PDF文档》这篇文章主要为大家详细介绍了如何使用C#实现一键批量合并PDF文档功能,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言效果展示功能实现1、添加文件2、文件分组(书签)3、定义页码范围4、自定义显示5、定义页面尺寸6、PDF批量合并7、其他方法

JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法

《JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法》:本文主要介绍JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法,每种方法结合实例代码给大家介绍的非常... 目录引言:为什么"相等"判断如此重要?方法1:使用some()+includes()(适合小数组)方法2

Java集合中的链表与结构详解

《Java集合中的链表与结构详解》链表是一种物理存储结构上非连续的存储结构,数据元素的逻辑顺序的通过链表中的引用链接次序实现,文章对比ArrayList与LinkedList的结构差异,详细讲解了链表... 目录一、链表概念与结构二、当向单链表的实现2.1 准备工作2.2 初始化链表2.3 打印数据、链表长

MySQL进行分片合并的实现步骤

《MySQL进行分片合并的实现步骤》分片合并是指在分布式数据库系统中,将不同分片上的查询结果进行整合,以获得完整的查询结果,下面就来具体介绍一下,感兴趣的可以了解一下... 目录环境准备项目依赖数据源配置分片上下文分片查询和合并代码实现1. 查询单条记录2. 跨分片查询和合并测试结论分片合并(Shardin

基于Python实现进阶版PDF合并/拆分工具

《基于Python实现进阶版PDF合并/拆分工具》在数字化时代,PDF文件已成为日常工作和学习中不可或缺的一部分,本文将详细介绍一款简单易用的PDF工具,帮助用户轻松完成PDF文件的合并与拆分操作... 目录工具概述环境准备界面说明合并PDF文件拆分PDF文件高级技巧常见问题完整源代码总结在数字化时代,PD

pandas数据的合并concat()和merge()方式

《pandas数据的合并concat()和merge()方式》Pandas中concat沿轴合并数据框(行或列),merge基于键连接(内/外/左/右),concat用于纵向或横向拼接,merge用于... 目录concat() 轴向连接合并(1) join='outer',axis=0(2)join='o

Spring Boot配置和使用两个数据源的实现步骤

《SpringBoot配置和使用两个数据源的实现步骤》本文详解SpringBoot配置双数据源方法,包含配置文件设置、Bean创建、事务管理器配置及@Qualifier注解使用,强调主数据源标记、代... 目录Spring Boot配置和使用两个数据源技术背景实现步骤1. 配置数据源信息2. 创建数据源Be

Python使用python-can实现合并BLF文件

《Python使用python-can实现合并BLF文件》python-can库是Python生态中专注于CAN总线通信与数据处理的强大工具,本文将使用python-can为BLF文件合并提供高效灵活... 目录一、python-can 库:CAN 数据处理的利器二、BLF 文件合并核心代码解析1. 基础合