上一篇博客:LeetCode 20. 有效的括号(栈、字符串)
写在前面:大家好!我是
ACfun
,我的昵称来自两个单词Accepted
和fun
。我是一个热爱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 的长度为 n, l2 的长度为 m,则时间复杂度为 O(m + n)。
提交情况
未完待续,持续更新中……