-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmerge_two_sorted_lists.rs
58 lines (55 loc) · 1.47 KB
/
merge_two_sorted_lists.rs
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
///
/// Problem: Merge Two Sorted Lists
///
/// You are given the heads of two sorted linked lists `list1` and `list2`. Merge the two lists into one sorted list.
/// The list should be made by splicing together the nodes of the first two lists.
///
/// Return the head of the merged linked list.
///
/// Example 1:
/// Input: list1 = [1,2,4], list2 = [1,3,4]
/// Output: [1,1,2,3,4,4]
///
/// Example 2:
/// Input: list1 = [], list2 = []
/// Output: []
///
/// Example 3:
/// Input: list1 = [], list2 = [0]
/// Output: [0]
///
/// # Solution:
///
/// Time complexity: O(n + m)
/// Space complexity: O(n + m)
#[derive(PartialEq, Eq, Clone, Debug)]
pub struct ListNode {
pub val: i32,
pub next: Option<Box<ListNode>>,
}
impl ListNode {
#[inline]
pub 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(l), None) | (None, Some(l)) => Some(l),
(Some(mut l1), Some(mut l2)) => {
if l1.val <= l2.val {
l1.next = Solution::merge_two_lists(l1.next.take(), Some(l2));
Some(l1)
} else {
l2.next = Solution::merge_two_lists(Some(l1), l2.next.take());
Some(l2)
}
}
}
}
}