diff --git a/problems/0002-add-two-numbers/solution.py b/problems/0002-add-two-numbers/solution.py new file mode 100644 index 0000000..03031bd --- /dev/null +++ b/problems/0002-add-two-numbers/solution.py @@ -0,0 +1,21 @@ +class ListNode: + def __init__(self, val=0, next=None): + self.val = val + self.next = next + + +class Solution: + def addTwoNumbers(self, l1: ListNode | None, l2: ListNode | None) -> ListNode | None: + dummy = ListNode() + curr = dummy + carry = 0 + while l1 or l2 or carry: + v1 = l1.val if l1 else 0 + v2 = l2.val if l2 else 0 + digit = (v1 + v2 + carry) % 10 + carry = (v1 + v2 + carry) // 10 + curr.next = ListNode(digit) + curr = curr.next + l1 = l1.next if l1 else None + l2 = l2.next if l2 else None + return dummy.next diff --git a/problems/0002-add-two-numbers/solution_test.py b/problems/0002-add-two-numbers/solution_test.py new file mode 100644 index 0000000..eec841f --- /dev/null +++ b/problems/0002-add-two-numbers/solution_test.py @@ -0,0 +1,30 @@ +import pytest +from solution import ListNode, Solution + + +def build(vals): + head = None + for v in reversed(vals): + head = ListNode(v, head) + return head + + +def to_list(node): + out = [] + while node: + out.append(node.val) + node = node.next + return out + + +@pytest.mark.parametrize( + "l1,l2,expected", + [ + ([2, 4, 3], [5, 6, 4], [7, 0, 8]), + ([0], [0], [0]), + ([9, 9, 9, 9, 9, 9, 9], [9, 9, 9, 9], [8, 9, 9, 9, 0, 0, 0, 1]), + ], +) +def test_add_two_numbers(l1, l2, expected): + result = Solution().addTwoNumbers(build(l1), build(l2)) + assert to_list(result) == expected