递归
链表
题目描述
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例 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
均按 非递减顺序 排列
解法
方法一:递归
我们先判断链表 $l_1$ 和 $l_2$ 是否为空,若其中一个为空,则返回另一个链表。否则,我们比较 $l_1$ 和 $l_2$ 的头节点:
若 $l_1$ 的头节点的值小于等于 $l_2$ 的头节点的值,则递归调用函数 $mergeTwoLists(l_1.next, l_2)$,并将 $l_1$ 的头节点与返回的链表头节点相连,返回 $l_1$ 的头节点。
否则,递归调用函数 $mergeTwoLists(l_1, l_2.next)$,并将 $l_2$ 的头节点与返回的链表头节点相连,返回 $l_2$ 的头节点。
时间复杂度 $O(m + n)$,空间复杂度 $O(m + n)$。其中 $m$ 和 $n$ 分别为两个链表的长度。
Python3 Java C++ Go TypeScript Rust JavaScript C# Ruby
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 # Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution :
def mergeTwoLists (
self , list1 : Optional [ ListNode ], list2 : Optional [ ListNode ]
) -> Optional [ ListNode ]:
if list1 is None or list2 is None :
return list1 or list2
if list1 . val <= list2 . val :
list1 . next = self . mergeTwoLists ( list1 . next , list2 )
return list1
else :
list2 . next = self . mergeTwoLists ( list1 , list2 . next )
return list2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 /**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode mergeTwoLists ( ListNode list1 , ListNode list2 ) {
if ( list1 == null ) {
return list2 ;
}
if ( list2 == null ) {
return list1 ;
}
if ( list1 . val <= list2 . val ) {
list1 . next = mergeTwoLists ( list1 . next , list2 );
return list1 ;
} else {
list2 . next = mergeTwoLists ( list1 , list2 . next );
return list2 ;
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 /**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public :
ListNode * mergeTwoLists ( ListNode * list1 , ListNode * list2 ) {
if ( ! list1 ) return list2 ;
if ( ! list2 ) return list1 ;
if ( list1 -> val <= list2 -> val ) {
list1 -> next = mergeTwoLists ( list1 -> next , list2 );
return list1 ;
} else {
list2 -> next = mergeTwoLists ( list1 , list2 -> next );
return list2 ;
}
}
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 /**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func mergeTwoLists ( list1 * ListNode , list2 * ListNode ) * ListNode {
if list1 == nil {
return list2
}
if list2 == nil {
return list1
}
if list1 . Val <= list2 . Val {
list1 . Next = mergeTwoLists ( list1 . Next , list2 )
return list1
} else {
list2 . Next = mergeTwoLists ( list1 , list2 . Next )
return list2
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 /**
* Definition for singly-linked list.
* class ListNode {
* val: number
* next: ListNode | null
* constructor(val?: number, next?: ListNode | null) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
* }
*/
function mergeTwoLists ( list1 : ListNode | null , list2 : ListNode | null ) : ListNode | null {
if ( list1 == null || list2 == null ) {
return list1 || list2 ;
}
if ( list1 . val < list2 . val ) {
list1 . next = mergeTwoLists ( list1 . next , list2 );
return list1 ;
} else {
list2 . next = mergeTwoLists ( list1 , list2 . next );
return list2 ;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 // Definition for singly-linked list.
// #[derive(PartialEq, Eq, Clone, Debug)]
// pub struct ListNode {
// pub val: i32,
// pub next: Option<Box<ListNode>>
// }
//
// impl ListNode {
// #[inline]
// fn new(val: i32) -> Self {
// ListNode {
// next: None,
// val
// }
// }
// }
impl Solution {
pub fn merge_two_lists (
list1 : Option < Box < ListNode >> ,
list2 : Option < Box < ListNode >> ,
) -> Option < Box < ListNode >> {
match ( list1 , list2 ) {
( None , None ) => None ,
( Some ( list ), None ) => Some ( list ),
( None , Some ( list )) => Some ( list ),
( Some ( mut list1 ), Some ( mut list2 )) => {
if list1 . val < list2 . val {
list1 . next = Self :: merge_two_lists ( list1 . next , Some ( list2 ));
Some ( list1 )
} else {
list2 . next = Self :: merge_two_lists ( Some ( list1 ), list2 . next );
Some ( list2 )
}
}
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 /**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} list1
* @param {ListNode} list2
* @return {ListNode}
*/
var mergeTwoLists = function ( list1 , list2 ) {
if ( ! list1 || ! list2 ) {
return list1 || list2 ;
}
if ( list1 . val <= list2 . val ) {
list1 . next = mergeTwoLists ( list1 . next , list2 );
return list1 ;
} else {
list2 . next = mergeTwoLists ( list1 , list2 . next );
return list2 ;
}
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 /**
* Definition for singly-linked list.
* public class ListNode {
* public int val;
* public ListNode next;
* public ListNode(int val=0, ListNode next=null) {
* this.val = val;
* this.next = next;
* }
* }
*/
public class Solution {
public ListNode MergeTwoLists ( ListNode list1 , ListNode list2 ) {
ListNode dummy = new ListNode ();
ListNode cur = dummy ;
while ( list1 != null && list2 != null )
{
if ( list1 . val <= list2 . val )
{
cur . next = list1 ;
list1 = list1 . next ;
}
else
{
cur . next = list2 ;
list2 = list2 . next ;
}
cur = cur . next ;
}
cur . next = list1 == null ? list2 : list1 ;
return dummy . next ;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 # Definition for singly-linked list.
# class ListNode
# attr_accessor :val, :next
# def initialize(val = 0, _next = nil)
# @val = val
# @next = _next
# end
# end
# @param {ListNode} list1
# @param {ListNode} list2
# @return {ListNode}
def merge_two_lists ( list1 , list2 )
dummy = ListNode . new ()
cur = dummy
while list1 && list2
if list1 . val <= list2 . val
cur . next = list1
list1 = list1 . next
else
cur . next = list2
list2 = list2 . next
end
cur = cur . next
end
cur . next = list1 || list2
dummy . next
end
方法二:迭代
我们也可以用迭代的方式来实现两个排序链表的合并。
我们先定义一个虚拟头节点 $dummy$,然后循环遍历两个链表,比较两个链表的头节点,将较小的节点添加到 $dummy$ 的末尾,直到其中一个链表为空,然后将另一个链表的剩余部分添加到 $dummy$ 的末尾。
最后返回 $dummy.next$ 即可。
时间复杂度 $O(m + n)$,其中 $m$ 和 $n$ 分别为两个链表的长度。忽略答案链表的空间消耗,空间复杂度 $O(1)$。
Python3 Java C++ Go TypeScript Rust JavaScript PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 # Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution :
def mergeTwoLists (
self , list1 : Optional [ ListNode ], list2 : Optional [ ListNode ]
) -> Optional [ ListNode ]:
dummy = ListNode ()
curr = dummy
while list1 and list2 :
if list1 . val <= list2 . val :
curr . next = list1
list1 = list1 . next
else :
curr . next = list2
list2 = list2 . next
curr = curr . next
curr . next = list1 or list2
return dummy . next
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 /**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode mergeTwoLists ( ListNode list1 , ListNode list2 ) {
ListNode dummy = new ListNode ();
ListNode curr = dummy ;
while ( list1 != null && list2 != null ) {
if ( list1 . val <= list2 . val ) {
curr . next = list1 ;
list1 = list1 . next ;
} else {
curr . next = list2 ;
list2 = list2 . next ;
}
curr = curr . next ;
}
curr . next = list1 == null ? list2 : list1 ;
return dummy . next ;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 /**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public :
ListNode * mergeTwoLists ( ListNode * list1 , ListNode * list2 ) {
ListNode * dummy = new ListNode ();
ListNode * curr = dummy ;
while ( list1 && list2 ) {
if ( list1 -> val <= list2 -> val ) {
curr -> next = list1 ;
list1 = list1 -> next ;
} else {
curr -> next = list2 ;
list2 = list2 -> next ;
}
curr = curr -> next ;
}
curr -> next = list1 ? list1 : list2 ;
return dummy -> next ;
}
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 /**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func mergeTwoLists ( list1 * ListNode , list2 * ListNode ) * ListNode {
dummy := & ListNode {}
curr := dummy
for list1 != nil && list2 != nil {
if list1 . Val <= list2 . Val {
curr . Next = list1
list1 = list1 . Next
} else {
curr . Next = list2
list2 = list2 . Next
}
curr = curr . Next
}
if list1 != nil {
curr . Next = list1
} else {
curr . Next = list2
}
return dummy . Next
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 /**
* Definition for singly-linked list.
* class ListNode {
* val: number
* next: ListNode | null
* constructor(val?: number, next?: ListNode | null) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
* }
*/
function mergeTwoLists ( list1 : ListNode | null , list2 : ListNode | null ) : ListNode | null {
const dummy = new ListNode ( 0 );
let cur = dummy ;
while ( list1 != null && list2 != null ) {
if ( list1 . val < list2 . val ) {
cur . next = list1 ;
list1 = list1 . next ;
} else {
cur . next = list2 ;
list2 = list2 . next ;
}
cur = cur . next ;
}
cur . next = list1 || list2 ;
return dummy . next ;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 // Definition for singly-linked list.
// #[derive(PartialEq, Eq, Clone, Debug)]
// pub struct ListNode {
// pub val: i32,
// pub next: Option<Box<ListNode>>
// }
//
// impl ListNode {
// #[inline]
// fn new(val: i32) -> Self {
// ListNode {
// next: None,
// val
// }
// }
// }
impl Solution {
pub fn merge_two_lists (
mut list1 : Option < Box < ListNode >> ,
mut list2 : Option < Box < ListNode >> ,
) -> Option < Box < ListNode >> {
let mut new_list = ListNode :: new ( 0 );
let mut cur = & mut new_list ;
while list1 . is_some () && list2 . is_some () {
let ( l1 , l2 ) = ( list1 . as_deref_mut (). unwrap (), list2 . as_deref_mut (). unwrap ());
if l1 . val < l2 . val {
let next = l1 . next . take ();
cur . next = list1 . take ();
list1 = next ;
} else {
let next = l2 . next . take ();
cur . next = list2 . take ();
list2 = next ;
}
cur = cur . next . as_deref_mut (). unwrap ();
}
cur . next = list1 . or ( list2 );
new_list . next
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 /**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} list1
* @param {ListNode} list2
* @return {ListNode}
*/
var mergeTwoLists = function ( list1 , list2 ) {
const dummy = new ListNode ();
let curr = dummy ;
while ( list1 && list2 ) {
if ( list1 . val <= list2 . val ) {
curr . next = list1 ;
list1 = list1 . next ;
} else {
curr . next = list2 ;
list2 = list2 . next ;
}
curr = curr . next ;
}
curr . next = list1 || list2 ;
return dummy . next ;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 # Definition for singly-linked list.
# class ListNode {
# public $val;
# public $next;
# public function __construct($val = 0, $next = null)
# {
# $this->val = $val;
# $this->next = $next;
# }
# }
class Solution {
/**
* @param ListNode $list1
* @param ListNode $list2
* @return ListNode
*/
function mergeTwoLists($list1, $list2) {
$dummy = new ListNode(0);
$current = $dummy;
while ($list1 != null && $list2 != null) {
if ($list1->val <= $list2->val) {
$current->next = $list1;
$list1 = $list1->next;
} else {
$current->next = $list2;
$list2 = $list2->next;
}
$current = $current->next;
}
if ($list1 != null) {
$current->next = $list1;
} elseif ($list2 != null) {
$current->next = $list2;
}
return $dummy->next;
}
}