21.合并两个有序链表

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 

示例 1:

输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]
示例 2:

输入:l1 = [], l2 = []
输出:[]
示例 3:

输入:l1 = [], l2 = [0]
输出:[0]

提示:

两个链表的节点数目范围是 [0, 50]
-100 <= Node.val <= 100
l1 和 l2 均按 非递减顺序 排列

 方法一:递归

时间复杂度:O(n+m)

空间复杂度:O(n+m)

 1 /**
 2  * Defination for singly-linked list.
 3  * function ListNode(val,next){
 4  * this.val=(val===undefined?0:val)
 5  * this.next=(next===undefined?null:next)
 6  * }
 7  */
 8 /**
 9  * @param {ListNode} list1
10  * @param {ListNode} list2
11  * @return {ListNode}
12  */
13 var mergeTwoLists = function(list1, list2) {
14     if (list1 === null) {
15         return list2;
16     } else if (list2 === null) {
17         return list1;
18     } else if (list1.val < list2.val) {
19         list1.next = mergeTwoLists(list1.next, list2);
20         return list1;
21     } else {
22         list2,
23         (next = mergeTwoLists(list1, list2.next));
24         return list2;
25     }
26 };

方法二:迭代

时间复杂度:O(n+m)

空间复杂度:O(1)

 1 /**
 2  * Defination for singly-linked list.
 3  * function ListNode(val,next){
 4  * this.val=(val===undefined?0:val)
 5  * this.next=(next===undefined?null:next)
 6  * }
 7  */
 8 /**
 9  * @param {ListNode} list1
10  * @param {ListNode} list2
11  * @return {ListNode}
12  */
13 var mergeTwoLists = function(list1, list2) {
14     //哨兵节点prehead
15     const prehead = new ListNode(-1);
16     let prev = prehead;
17     while (list1 !== null && list2 !== null) {
18         if (list1.val <= list2.val) {
19             prev.next = list1;
20             list1 = list1.next;
21         } else {
22             prev.next = list2;
23             list2 = list2.next;
24         }
25         prev = prev.next;
26     }
27     prev.next = list1 === null ? list2 : list1;
28     return prehead.next;
29 };
posted @ 2022-11-02 15:56  icyyyy  阅读(29)  评论(0)    收藏  举报