题目
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例
cpp
输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]
思路
每次递归都会比较当前两个节点的值,选择较小的节点作为合并后的链表的下一个节点,并继续递归合并剩余部分。(等于情况谁都可以,这里判给(list2))
这个过程会持续进行,直到有一个链表为空,然后将另一个链表直接连接到合并后的链表的末尾。因为是非递减的链表所以可以这样直接合并。
测试代码
class Solution{
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
if (list1==null)return list2;
if (list2==null)return list1;
if (list1.val<list2.val){
list1.next=mergeTwoLists(list1.next, list2);
return list1;
}else {
list2.next=mergeTwoLists(list1, list2.next);
return list2;
}
}
}
复杂度
时间复杂度 :
最坏情况下,每次递归都会处理一个节点,并且每个节点都需要比较和连接操作。
假设 n 是 list1 的长度,m 是 list2 的长度。
所以总体时间复杂度为 O(n + m)。
空间复杂度 :
在最坏情况下,递归深度达到 n + m。
因此,空间复杂度为 O(n + m),线性级别。