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++)相关推荐

  1. 《LeetCode力扣练习》第21题 合并两个有序链表 Java

    <LeetCode力扣练习>第21题 合并两个有序链表 Java 一.资源 题目: 将两个升序链表合并为一个新的 升序 链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例 ...

  2. 【LeetCode】21、合并两个有序链表

    21.合并两个有序链表 题目: 将两个升序链表合并为一个新的 升序 链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例1: 输入:l1 = [1,2,4], l2 = [1,3,4] ...

  3. LeetCode题组:第21题-合并两个有序链表

    1.题目:合并两个有序链表 将两个升序链表合并为一个新的升序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4 输出: ...

  4. LeetCode(21)——合并两个有序链表(JavaScript)

    将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4 输出:1->1->2- ...

  5. [剑指offer]面试题第[25]题[Leedcode][JAVA][第21题][合并两个有序链表]

    [问题描述][简单] 将两个升序链表合并为一个新的升序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例:输入:1->2->4, 1->3->4 输出:1-&g ...

  6. 两个有序链表序列的交集_腾讯50题---合并两个有序链表(简单)

    5.1 题目描述: 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4 输出:1-&g ...

  7. Leetcode每日一题:21.merge-two-sorted-lists(合并两个有序链表)

    常规方法:采用归并排序的归并方法即可 struct ListNode {int val;ListNode *next;ListNode(int x) : val(x), next(NULL) {} } ...

  8. leetcode算法题--合并两个有序链表

    原题链接:https://leetcode-cn.com/problems/merge-two-sorted-lists/ ListNode* mergeTwoLists(ListNode* l1, ...

  9. LeetCode 21. 合并两个有序链表(链表)

    上一篇博客:LeetCode 20. 有效的括号(栈.字符串)  写在前面:大家好!我是ACfun,我的昵称来自两个单词Accepted和fun.我是一个热爱ACM的蒟蒻.最近萌生了刷LeetCode ...

  10. LeetCode 21合并两个有序链表22括号生成

    微信搜索bigsai,回复进群,加入打卡.维护不易,欢迎点赞支持! 合并两个有序列表 将两个升序链表合并为一个新的 升序 链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1 ...

最新文章

  1. 第四条:通过私有构造器强化不可实例化的能力
  2. Kong APIGW — Plugins — 监控告警、日志审计
  3. MATLAB从入门到精通-缺失值和异常值的处理应用案例
  4. NetBeans工具学习之道:NetBeans的(默认)快捷键
  5. c语言深度剖析第三版pdf_入门到入坟,蕴含全网最强知识点3283页笔记、pdf教程,活到老,学到老...
  6. gentry同态加密算法_基于Gentry全同态加密算法公钥个数优化的研究
  7. 9.1.3 .net framework通过业务逻辑层自动生成WebApi的做法
  8. 30、vue 过滤器(filters)
  9. GRIDVIEW中实现上移下移的存储过程
  10. springboot整合websocket实现微信小程序聊天
  11. C51单片机学习笔记——秒表
  12. 笔记本电脑装android系统安装教程,电脑安装安卓系统教程 三分钟教学换装系统...
  13. SDUT —— 计算组合数
  14. Flink1.15源码阅读flink-clients客户端执行流程(阅读较枯燥)
  15. 9.28 正睿普及3
  16. SFB 项目经验-10-Polycom CX700-不停弹窗口要输入用户名和密码
  17. 数字签名开源_数字时代的开源与人文
  18. 优秀录屏工具:Screenium 3 for Mac
  19. 汇编语言答案(王爽)第三版
  20. 阿里云CentOS7下载地址

热门文章

  1. 2017初秋最时髦服装搭配,裙子+短靴搭配
  2. 数据中心22年基础架构演进史
  3. ArcGIS_数字高程模型的建立
  4. JavaWeb开发与代码的编写(二十四)
  5. matlabadftest_怎样用matlab做时间序列平稳性检验
  6. 简单易用的运动控制卡(十二):运动控制系统的安全设置
  7. VMware Workstation安装Win7系统
  8. vb6.0 清除IE浏览器缓存
  9. 动手实现一个跑步小程序
  10. c++11线程池的实现原理及回调函数的使用