算法|算法:合并两个排序的链表

算法|算法:合并两个排序的链表

文章图片

算法|算法:合并两个排序的链表

文章图片

算法|算法:合并两个排序的链表

【算法|算法:合并两个排序的链表】
输入两个递增排序的链表 , 合并这两个链表并使新链表中的节点仍然是递增排序的 。
示例

  • 输入: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本文内容出处是力扣官网 , 希望和大家一起刷算法 , 在后面的路上不变秃但是变强!
好兄弟可以点赞并关注我 , 全部都是干货 。