diff --git a/src/solution/mod.rs b/src/solution/mod.rs index a4cf138..f37f7e4 100644 --- a/src/solution/mod.rs +++ b/src/solution/mod.rs @@ -2,3 +2,4 @@ mod s0001_two_sum; mod s0009_palindrome_number; mod s0020_valid_parentheses; mod s2697_lexicographically_smallest_palindrome; +mod s0002_add_two_numbers; diff --git a/src/solution/s0002_add_two_numbers.rs b/src/solution/s0002_add_two_numbers.rs new file mode 100644 index 0000000..1c03014 --- /dev/null +++ b/src/solution/s0002_add_two_numbers.rs @@ -0,0 +1,122 @@ +/** + * [2] Add Two Numbers + * + * You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order, and each of their nodes contains a single digit. Add the two numbers and return the sum as a linked list. + * You may assume the two numbers do not contain any leading zero, except the number 0 itself. + * + * Example 1: + * + * Input: l1 = [2,4,3], l2 = [5,6,4] + * Output: [7,0,8] + * Explanation: 342 + 465 = 807. + * + * Example 2: + * + * Input: l1 = [0], l2 = [0] + * Output: [0] + * + * Example 3: + * + * Input: l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9] + * Output: [8,9,9,9,0,0,0,1] + * + * + * Constraints: + * + * The number of nodes in each linked list is in the range [1, 100]. + * 0 <= Node.val <= 9 + * It is guaranteed that the list represents a number that does not have leading zeros. + * + */ +pub struct Solution {} +use crate::util::linked_list::{ListNode, to_list}; + +// problem: https://leetcode.cn/problems/add-two-numbers/ +// discuss: https://leetcode.cn/problems/add-two-numbers/discuss/?currentPage=1&orderBy=most_votes&query= + +// submission codes start here + +// Definition for singly-linked list. +// #[derive(PartialEq, Eq, Clone, Debug)] +// pub struct ListNode { +// pub val: i32, +// pub next: Option> +// } +// +// impl ListNode { +// #[inline] +// fn new(val: i32) -> Self { +// ListNode { +// next: None, +// val +// } +// } +// } +impl Solution { + pub fn add_two_numbers(l1: Option>, l2: Option>) + -> Option> { + let (mut left, mut right) = (l1, l2); + let mut dummy_head = Some(Box::new(ListNode::new(0))); + let mut now = &mut dummy_head; + let mut overflow = 0; + + loop { + if left.is_none() && right.is_none() && overflow == 0 { + break + } + + let left_value = match left { + None => { + 0 + } + Some(node) => { + left = node.next; + node.val + } + }; + + let right_value = match right { + None => { + 0 + } + Some(node) => { + right = node.next; + node.val + } + }; + + let value = overflow + left_value + right_value; + overflow = value / 10; + + now.as_mut().unwrap().next = Some(Box::new(ListNode::new(value % 10))); + now = &mut now.as_mut().unwrap().next; + } + + dummy_head.unwrap().next + } +} + +// submission codes end + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_2() { + assert_eq!( + Solution::add_two_numbers(to_list(vec![2, 4, 3]), to_list(vec![5, 6, 4])), + to_list(vec![7, 0, 8]) + ); + + assert_eq!( + Solution::add_two_numbers(to_list(vec![9, 9, 9, 9]), to_list(vec![9, 9, 9, 9, 9, 9])), + to_list(vec![8, 9, 9, 9, 0, 0, 1]) + ); + + assert_eq!( + Solution::add_two_numbers(to_list(vec![0]), to_list(vec![0])), + to_list(vec![0]) + ); + } +}