From c8b542689ca7f468eba2ac12a422143aadaa3de1 Mon Sep 17 00:00:00 2001 From: Sainnhe Park Date: Thu, 10 Mar 2022 20:25:55 +0800 Subject: [PATCH] Add Two Numbers --- include/s2_add_two_numbers.hpp | 31 ++++++++++++++++++++ src/s2_add_two_numbers.cpp | 23 +++++++++++++++ tests/s2_add_two_numbers.cpp | 53 ++++++++++++++++++++++++++++++++++ 3 files changed, 107 insertions(+) create mode 100644 include/s2_add_two_numbers.hpp create mode 100644 src/s2_add_two_numbers.cpp create mode 100644 tests/s2_add_two_numbers.cpp diff --git a/include/s2_add_two_numbers.hpp b/include/s2_add_two_numbers.hpp new file mode 100644 index 0000000..4d9df24 --- /dev/null +++ b/include/s2_add_two_numbers.hpp @@ -0,0 +1,31 @@ +#ifndef S2_ADD_TWO_NUMBERS_HPP +#define S2_ADD_TWO_NUMBERS_HPP + +struct ListNode { + int val; + ListNode* next; + ListNode() : val(0), next(nullptr) {} + ListNode(int x) : val(x), next(nullptr) {} + ListNode(int x, ListNode* next) : val(x), next(next) {} +}; + +class Solution { + public: + /** + * @brief 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. + * + * @param l1 the first linked list + * @param l2 the second linked list + */ + ListNode* addTwoNumbers(ListNode* l1, ListNode* l2); +}; + +#endif diff --git a/src/s2_add_two_numbers.cpp b/src/s2_add_two_numbers.cpp new file mode 100644 index 0000000..79ab052 --- /dev/null +++ b/src/s2_add_two_numbers.cpp @@ -0,0 +1,23 @@ +#include "s2_add_two_numbers.hpp" + +ListNode* Solution::addTwoNumbers(ListNode* l1, ListNode* l2) { + ListNode *l_begin = new ListNode((l1->val + l2->val) % 10); + ListNode *l_end = l_begin; + int carry{ (l1->val + l2->val) >= 10 ? 1 : 0 }; + while (l1->next != nullptr || l2->next != nullptr || carry != 0) { + if (l1->next == nullptr && l2->next != nullptr) { + l1->next = new ListNode(0); + } else if (l1->next != nullptr && l2->next == nullptr) { + l2->next = new ListNode(0); + } else if (l1->next == nullptr && l2->next == nullptr && carry != 0) { + l1->next = new ListNode(0); + l2->next = new ListNode(0); + } + l1 = l1->next; + l2 = l2->next; + l_end->next = new ListNode((l1->val + l2->val + carry) % 10); + l_end = l_end->next; + carry = (l1->val + l2->val + carry) >= 10 ? 1 : 0; + } + return l_begin; +} diff --git a/tests/s2_add_two_numbers.cpp b/tests/s2_add_two_numbers.cpp new file mode 100644 index 0000000..775cb2f --- /dev/null +++ b/tests/s2_add_two_numbers.cpp @@ -0,0 +1,53 @@ +#include "s2_add_two_numbers.hpp" + +#include + +TEST(Problem2, Case1) { + ListNode *l1 = + new ListNode(2, + new ListNode(4, + new ListNode(3))); + ListNode *l2 = + new ListNode(5, + new ListNode(6, + new ListNode(4))); + Solution solution; + ListNode *l = solution.addTwoNumbers(l1, l2); + EXPECT_EQ(l->val, 7); + EXPECT_EQ(l->next->val, 0); + EXPECT_EQ(l->next->next->val, 8); +} + +TEST(Problem2, Case2) { + ListNode *l1 = new ListNode(0); + ListNode *l2 = new ListNode(0); + Solution solution; + ListNode *l = solution.addTwoNumbers(l1, l2); + EXPECT_EQ(l->val, 0); +} + +TEST(Problem2, Case3) { + ListNode *l1 = + new ListNode(9, + new ListNode(9, + new ListNode(9, + new ListNode(9, + new ListNode(9, + new ListNode(9, + new ListNode(9))))))); + ListNode *l2 = + new ListNode(9, + new ListNode(9, + new ListNode(9, + new ListNode(9)))); + Solution solution; + ListNode *l = solution.addTwoNumbers(l1, l2); + EXPECT_EQ(l->val, 8); + EXPECT_EQ(l->next->val, 9); + EXPECT_EQ(l->next->next->val, 9); + EXPECT_EQ(l->next->next->next->val, 9); + EXPECT_EQ(l->next->next->next->next->val, 0); + EXPECT_EQ(l->next->next->next->next->next->val, 0); + EXPECT_EQ(l->next->next->next->next->next->next->val, 0); + EXPECT_EQ(l->next->next->next->next->next->next->next->val, 1); +}