输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。
示例
- 输入:1->2->4, 1->3->4
- 输出:1->1->2->3->4->4
限制
- 0 <= 链表长度 <= 1000
方法一:迭代(伪头节点)
当 l1 和 l2 都不是空链表时,判断 l1 和 l2 哪个链表的节点值最小,将较小的值的节点添加到结果链表里,并且将对应的链表的节点向下移一位。
代码如下:
复杂度分析
- 时间复杂度:O(n+m),其中 n 和 m 分别为两个链表的长度。因为每次循环迭代中,l1 和 l2 只有一个元素会被放进合并链表中, 因此 while 循环的次数不会超过两个链表的长度之和。所有其他操作的时间复杂度都是常数级别的,因此总的时间复杂度为 O(n+m)。
- 空间复杂度:O(1)。我们只需要在常数的空间存放若干变量。
方法二:递归
两个链表头部值较小的一个节点与剩下元素的 merge 操作结果合并。
代码如下:
复杂度分析
- 时间复杂度:O(n+m),其中 n 和 m 分别为两个链表的长度。因为每次调用递归都会去掉 l1 或者 l2 的头节点(直到至少有一个链表为空),函数 mergeTwoList 至多只会递归调用每个节点一次。因此,时间复杂度取决于合并后的链表长度,即 O(n+m)。
- 空间复杂度:O(n+m),其中 n 和 m 分别为两个链表的长度。递归调用 mergeTwoLists 函数时需要消耗栈空间,栈空间的大小取决于递归调用的深度。结束递归调用时 mergeTwoLists 函数最多调用 n+m 次,因此空间复杂度为 O(n+m)。
END
本文内容出处是力扣官网,希望和大家一起刷算法,在后面的路上不变秃但是变强!
好兄弟可以点赞并关注我的公众号“javaAnswer”,全部都是干货。