将两个升序链表合并为一个新的升序链表
要求
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
原题:合并两个有序链表
示例
示例 1:
1 | 输入:l1 = [1,2,4], l2 = [1,3,4] |
示例 2:
1 | 输入:l1 = [], l2 = [] |
示例 3:
1 | 输入:l1 = [], l2 = [0] |
思路
ListNode 的定义
1 | public class ListNode { |
1、递归
看到一个大佬的图解思路,感觉非常清晰:一看就会,一写就废?详解递归
图解
- 首先确定头节点。L1 和 L2 第一个节点值都是 1,比较完大小后,第一次递归结束,以 L2 第一个节点作为头节点,则 L2.next 指向剩下需要递归的部分(list1, list2.next)
- 同理,第二次递归会得到一个较小的值,此时这个值指向剩下需要递归的部分,而 L2 第一个节点则指向第二次递归时得到的较小的值
- 一直递归下去,直到指向了 null,递归结束,返回最后剩下的部分
1 | class Solution { |
复杂度分析
时间复杂度:O(n + m),其中 n 和 m 分别为两个链表的长度。
空间复杂度:O(n + m)
2、迭代
首先,我们设定一个哨兵节点 prehead ,这可以在最后让我们比较容易地返回合并后的链表。我们维护一个 prev 指针,我们需要做的是调整它的 next 指针。然后,我们重复以下过程,直到 l1 或者 l2 指向了 null :如果 l1 当前节点的值小于等于 l2 ,我们就把 l1 当前的节点接在 prev 节点的后面同时将 l1 指针往后移一位。否则,我们对 l2 做同样的操作。不管我们将哪一个元素接在了后面,我们都需要把 prev 向后移一位。
1 | class Solution { |
复杂度分析
时间复杂度:O(n + m),其中 n 和 m 分别为两个链表的长度。
空间复杂度:O(1)
本文采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 ShiGuang
评论