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

   日期:2020-08-21     浏览:103    评论:0    
核心提示:将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

上一篇博客:LeetCode 20. 有效的括号(栈、字符串)

 写在前面:大家好!我是ACfun,我的昵称来自两个单词Acceptedfun。我是一个热爱ACM的蒟蒻。最近萌生了刷LeetCode的想法,所以我打算从LeetCode简单的题目开始做起,攻陷LeetCode。如果博客中有不足或者的错误的地方欢迎在评论区或者私信我指正,感谢大家的不吝赐教。我的唯一博客更新地址是:https://ac-fun.blog.csdn.net/。非常感谢大家的支持。一起加油,冲鸭!
用知识改变命运,用知识成就未来!加油 (ง •̀o•́)ง (ง •̀o•́)ง

原题链接:LeetCode 21. 合并两个有序链表

文章目录

  • 题目信息
    • 题目描述
    • 示例
  • 题解
    • 解题思路
    • 解题代码
    • 时间复杂度
    • 提交情况

题目信息

题目描述

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

示例

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

题解

解题思路

 这道题目其实就是经典的 2路-归并算法,在归并排序算法中我们就使用到了这一算法(详细的解释请看 经典排序算法之归并排序详解)。

 基本思路是当两个链表都不为空时不断的比较两个链表第一个节点值的大小,将较小的节点放到新链表的最后一个节点,然后使指向该链表当前节点的指针指向下一个节点,再继续进行比较。当其中有一个链表遍历完之后,我们直接将另外一个链表剩余的节点依次接到新链表的后面即可。

 首先我们定义一个虚拟头结点 dummy ,然后定义一个变量 tail 来指向虚拟头结点的尾结点。然后遍历两个链表,当两个链表都不为空的时候,我们比较两个链表的第一个节点的大小,将较小值的节点放到新链表的最后一个节点。再更新新链表的尾结点,使 tail 指向较小值的节点。不断的进行比较添加,最后返回虚拟头结点的下一个节点即可。





解题代码


class Solution {
public:
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
        auto dummy = new ListNode(-1), tail = dummy;
        while (l1 && l2) {
            if (l1->val < l2->val) {
                tail->next = l1;
                tail = tail->next;
                l1 = l1->next;
            } else {
                tail->next = l2;
                tail = tail->next;
                l2 = l2->next;
            }
        }
        
        if (l1) tail->next = l1;
        if (l2) tail->next = l2;
        return dummy->next;
    }
};

时间复杂度

 假设 l1 的长度为 nl2 的长度为 m,则时间复杂度为 O(m + n)

提交情况

未完待续,持续更新中……

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服