diff options
Diffstat (limited to 'add-two-numbers/src')
-rw-r--r-- | add-two-numbers/src/main.rs | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/add-two-numbers/src/main.rs b/add-two-numbers/src/main.rs new file mode 100644 index 0000000..3a9abe9 --- /dev/null +++ b/add-two-numbers/src/main.rs @@ -0,0 +1,46 @@ +fn main() { + println!("Hello, world!"); +} + +#[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 + } + } +} +// Comprehensive 3ms Recursive + +struct Solution {} +impl Default for ListNode { + fn default() -> Self { + ListNode::new(0) + } +} + +impl Solution { + pub fn add_two_numbers(l1: Option<Box<ListNode>>, l2: Option<Box<ListNode>>) -> Option<Box<ListNode>> { + Solution::add_two_numbers_with_carry(l1, l2, 0) + } + pub fn add_two_numbers_with_carry(l1: Option<Box<ListNode>>, l2: Option<Box<ListNode>>, carry: i32) -> Option<Box<ListNode>> { + if l1.is_none() && l2.is_none() && carry == 0 {return None;} + let a = l1.unwrap_or_default(); + let b = l2.unwrap_or_default(); + let sum = a.val + b.val + carry; + + let result = ListNode { + val: sum % 10, + next: Solution::add_two_numbers_with_carry(a.next, b.next, sum / 10) + }; + Some(Box::new(result)) + } +} + |