summaryrefslogtreecommitdiff
path: root/02_add-two-numbers
diff options
context:
space:
mode:
Diffstat (limited to '02_add-two-numbers')
-rw-r--r--02_add-two-numbers/Cargo.lock7
-rw-r--r--02_add-two-numbers/Cargo.toml6
-rw-r--r--02_add-two-numbers/src/main.rs84
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))
+ }
+}