021.合并两个有序链表,递归和遍历,beat100%
鲁迅说过,每天刷一遍二哥的 LeetCode 刷题笔记,离大厂就会更近一步(dog)。
题意
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
难度
简单
标签
链表、排序
示例
输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]
输入:l1 = [], l2 = []
输出:[]
输入:l1 = [], l2 = [0]
输出:[0]
分析 1
先来读题,关键词,两个升序链表,合并,一个新的升序链表。
既然升序过,那最小的数字肯定是两个链表l1
和l2
中头节点中的一个。
如果最小的是 l1
的头节点,那么第二小的节点肯定是l2
的头节点或者l1.next
,只要再比较一下两个的大小就能够得到第二小的节点。
如果最小的是 l2
的头节点,那么第二小的肯定是l1
的头节点或者l2.next
;
那我们就可以采用递归的方式:
if (l1.val < l2.val) {
l1.next = mergeTwoLists(l1.next, l2);
return l1;
} else {
l2.next = mergeTwoLists(l1, l2.next);
return l2;
}
如果 l1 的头节点小于 l2 的头节点,那么 l1 的 next 应该是 l1.next 或者 l2;
如果 l1 的头节点大于 l2 的头节点,那么 l2 的 next 应该是 l1 或者 l2.next;
每次递归调用都会返回当前两个链表头部较小的那个节点作为合并链表的当前节点。
递归的结束条件就是 l1 或者 l2 为空,那么返回另一个链表即可。因为如果其中一个链表为空,就意味着另一个链表已经是当前最终的排序链表了,我们可以直接返回非空链表作为合并后的链表。
// 如果 l1 为空,返回 l2
if (l1 == null) {
return l2;
}
// 如果 l2 为空,返回 l1
if (l2 == null) {
return l1;
}
真诚点赞 诚不我欺
回复