diff options
Diffstat (limited to '02_add-two-numbers')
| -rw-r--r-- | 02_add-two-numbers/Cargo.lock | 7 | ||||
| -rw-r--r-- | 02_add-two-numbers/Cargo.toml | 6 | ||||
| -rw-r--r-- | 02_add-two-numbers/src/main.rs | 84 |
3 files changed, 97 insertions, 0 deletions
diff --git a/02_add-two-numbers/Cargo.lock b/02_add-two-numbers/Cargo.lock new file mode 100644 index 0000000..78f2920 --- /dev/null +++ b/02_add-two-numbers/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "add_two_numbers" +version = "0.1.0" diff --git a/02_add-two-numbers/Cargo.toml b/02_add-two-numbers/Cargo.toml new file mode 100644 index 0000000..518f1a6 --- /dev/null +++ b/02_add-two-numbers/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "add_two_numbers" +version = "0.1.0" +edition = "2024" + +[dependencies] diff --git a/02_add-two-numbers/src/main.rs b/02_add-two-numbers/src/main.rs new file mode 100644 index 0000000..6b46dbf --- /dev/null +++ b/02_add-two-numbers/src/main.rs @@ -0,0 +1,84 @@ +fn main() { + let list1 = Some(Box::new(ListNode { + val: 2, + next: Some(Box::new(ListNode { + val: 4, + next: Some(Box::new(ListNode { val: 3, next: None })), + })), + })); + + let list2 = Some(Box::new(ListNode { + val: 5, + next: Some(Box::new(ListNode { + val: 6, + next: Some(Box::new(ListNode { val: 4, next: None })), + })), + })); + + Solution::add_two_numbers(list1, list2); +} + +struct Solution(()); + +#[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 add_two_numbers( + l1: Option<Box<ListNode>>, + l2: Option<Box<ListNode>>, + ) -> Option<Box<ListNode>> { + let ans = Self::double_walker(l1, l2, false); + ans + } + + fn double_walker( + l1: Option<Box<ListNode>>, + l2: Option<Box<ListNode>>, + carry: bool, + ) -> Option<Box<ListNode>> { + if let (None, None) = (&l1, &l2) { + if carry { + return Some(Box::new(ListNode::new(1))); + } else { + return None; + } + } + + let mut node = ListNode::new(0); + + if let Some(n1) = &l1 { + node.val += n1.val; + } + + if let Some(n2) = &l2 { + node.val += n2.val; + } + + if carry { + node.val += 1; + } + + node.next = Self::double_walker( + l1.and_then(|n| n.next), + l2.and_then(|n| n.next), + node.val >= 10, + ); + + if node.val >= 10 { + node.val = node.val - 10; + } + + Some(Box::new(node)) + } +} |
