LeetCode第 21 题:合并两个有序链表(C++)
leetcode链接
第一种方法(借助其他标准库容器)
遍历两个链表将元素均存入容器中(例如vector,或者multiset会更好吗?),调用泛型算法sort进行元素排序,最后在新建链表将排序好的元素导过去:
class Solution {
public:ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {vector<int> vec;while(l1 != NULL){vec.push_back(l1->val);l1 = l1->next;}while(l2 != NULL){vec.push_back(l2->val);l2 = l2->next;}sort(vec.begin(), vec.end());auto head = new ListNode;auto cur = head;for(const auto &c : vec){auto p = new ListNode(c);cur->next = p;cur = p;}return head->next;}
};
实测 ↑\uparrow↑ 性能不行,使用multiset也不太行的样子。。。
迭代
遍历的时候一边比较一边插入
简单易懂:
class Solution {
public:ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {// 不用判断是否有空链表auto head = new ListNode;auto cur = head;while(l1 != NULL && l2 != NULL){if(l1->val <= l2->val){auto p = new ListNode(l1->val);cur->next = p;cur = p;l1 = l1->next;}else{auto p = new ListNode(l2->val);cur->next = p;cur = p;l2 = l2->next;}}auto lst = (l1 == NULL) ? l2 : l1;while(lst != NULL){auto p = new ListNode(lst->val);cur->next = p;cur = p;lst = lst->next;}return head->next;}
};
第一遍写完之后发现上述代码很繁琐,优化如下:
class Solution {
public:ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {auto head = new ListNode;auto cur = head;while(l1 != NULL && l2 != NULL){if(l1->val <= l2->val){cur->next = l1;l1 = l1->next;}else{cur->next = l2;l2 = l2->next;}cur = cur->next;}cur->next = (l1 == NULL) ? l2 : l1;return head->next;}
};
还能写成这样:
class Solution {
public:ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {auto head = new ListNode;auto cur = head;while(l1 != NULL && l2 != NULL){// p是指向链表的指针auto p = (l1->val < l2->val) ? &l1 : &l2;cur->next = *p;cur = cur->next;*p = (*p)->next; }cur->next = (l1 == NULL) ? l2 : l1;auto ans = head->next;delete head;return ans;}
};
递归
写过206题的递归之后,这题的递归更简单,但是性能有待优化,不如上一种:
先判断是否有空链表,有则返回另一个链表;
比较两链表的头结点,偏小值做新链表的第一个结点,且该节点的next指向本函数(参数为较小值所在链表->next和另一个链表)。
class Solution {
public:ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {if(l1 == NULL)return l2;if(l2 == NULL)return l1;auto head = new ListNode;auto cur = head;if(l1->val <= l2->val){auto p = new ListNode(l1->val);cur->next = p;cur = p;cur->next = mergeTwoLists(l1->next, l2);}else{auto p = new ListNode(l2->val);cur->next = p;cur = p;cur->next = mergeTwoLists(l2->next, l1);}return head->next;}
};
优化(之前创建新的 p 好像是不必要的):
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;}else{l2->next = mergeTwoLists(l2->next, l1);return l2;}}
};
查看官方题解之后发现上述的if判断过多,应该改为if - else if - else结构,因为每次递归都指挥进入一条if里面,但是判断过程过多:
class Solution {
public:ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {if(l1 == NULL)return l2;else if(l2 == NULL)return l1;else if(l1->val < l2->val){l1->next = mergeTwoLists(l1->next, l2);return l1;}else{l2->next = mergeTwoLists(l2->next, l1);return l2;}}
};
LeetCode第 21 题:合并两个有序链表(C++)相关推荐
- 《LeetCode力扣练习》第21题 合并两个有序链表 Java
<LeetCode力扣练习>第21题 合并两个有序链表 Java 一.资源 题目: 将两个升序链表合并为一个新的 升序 链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例 ...
- 【LeetCode】21、合并两个有序链表
21.合并两个有序链表 题目: 将两个升序链表合并为一个新的 升序 链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例1: 输入:l1 = [1,2,4], l2 = [1,3,4] ...
- LeetCode题组:第21题-合并两个有序链表
1.题目:合并两个有序链表 将两个升序链表合并为一个新的升序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4 输出: ...
- LeetCode(21)——合并两个有序链表(JavaScript)
将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4 输出:1->1->2- ...
- [剑指offer]面试题第[25]题[Leedcode][JAVA][第21题][合并两个有序链表]
[问题描述][简单] 将两个升序链表合并为一个新的升序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例:输入:1->2->4, 1->3->4 输出:1-&g ...
- 两个有序链表序列的交集_腾讯50题---合并两个有序链表(简单)
5.1 题目描述: 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4 输出:1-&g ...
- Leetcode每日一题:21.merge-two-sorted-lists(合并两个有序链表)
常规方法:采用归并排序的归并方法即可 struct ListNode {int val;ListNode *next;ListNode(int x) : val(x), next(NULL) {} } ...
- leetcode算法题--合并两个有序链表
原题链接:https://leetcode-cn.com/problems/merge-two-sorted-lists/ ListNode* mergeTwoLists(ListNode* l1, ...
- LeetCode 21. 合并两个有序链表(链表)
上一篇博客:LeetCode 20. 有效的括号(栈.字符串) 写在前面:大家好!我是ACfun,我的昵称来自两个单词Accepted和fun.我是一个热爱ACM的蒟蒻.最近萌生了刷LeetCode ...
- LeetCode 21合并两个有序链表22括号生成
微信搜索bigsai,回复进群,加入打卡.维护不易,欢迎点赞支持! 合并两个有序列表 将两个升序链表合并为一个新的 升序 链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1 ...
最新文章
- 第四条:通过私有构造器强化不可实例化的能力
- Kong APIGW — Plugins — 监控告警、日志审计
- MATLAB从入门到精通-缺失值和异常值的处理应用案例
- NetBeans工具学习之道:NetBeans的(默认)快捷键
- c语言深度剖析第三版pdf_入门到入坟,蕴含全网最强知识点3283页笔记、pdf教程,活到老,学到老...
- gentry同态加密算法_基于Gentry全同态加密算法公钥个数优化的研究
- 9.1.3 .net framework通过业务逻辑层自动生成WebApi的做法
- 30、vue 过滤器(filters)
- GRIDVIEW中实现上移下移的存储过程
- springboot整合websocket实现微信小程序聊天
- C51单片机学习笔记——秒表
- 笔记本电脑装android系统安装教程,电脑安装安卓系统教程 三分钟教学换装系统...
- SDUT —— 计算组合数
- Flink1.15源码阅读flink-clients客户端执行流程(阅读较枯燥)
- 9.28 正睿普及3
- SFB 项目经验-10-Polycom CX700-不停弹窗口要输入用户名和密码
- 数字签名开源_数字时代的开源与人文
- 优秀录屏工具:Screenium 3 for Mac
- 汇编语言答案(王爽)第三版
- 阿里云CentOS7下载地址