「这是我参与2022首次更文挑战的第18天,活动详情查看:2022首次更文挑战」。
题目描述
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例 1:
输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]
思路分析
最简单的方式我们可以自己建立一个链表头,每次找到两个链表的最小值,将他附加到上面。
ListNode head;
if list1.val > list2.val {
head->next = list2
list2 = list2.next
}else{
head->next = list1
list1 = list1.next
}
但是在for循环的时候需要考虑很可能出现两个链表长度不一样,如果一个链表被遍历完成,那就会报错。因此需要在遍历的时候判断两个链表是否遍历完成。
可这样的话需要考虑的逻辑就多了,代码会变得很冗长。
当然我们还有更方便的办法
具体实现
ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
if(list1 == nullptr)return list2;
if(list2 == nullptr)return list1;
if(list1 -> val > list2 -> val) {
list2->next = mergeTwoLists(list1, list2->next);
return list2;
}else{
list1->next = mergeTwoLists(list1->next, list2);
return list1;
}
return nullptr;
}
总结
这里简单聊聊递归的优点和缺点
递归虽然会导致调用栈过深,会提升时间复杂度和空间复杂度。但是会合并一些同类的计算,却降低了代码的复杂度,提高了代码的可读性。
比如这道斐波那契数列,就很适合使用递归计算。对于之后二叉树的遍历(前序,中序,后序)都可以使用递归实现。
大多数递归可以实现的问题,都可以使用迭代来实现。在消耗上,迭代会更加的节省消耗。但是在可读性上,一般来说递归是优于迭代的