Hello,

Here’s my solution for the add two numbers problem on LeetCode.

**Example:**

Input:(2 -> 4 -> 3) + (5 -> 6 -> 4)Output:7 -> 0 -> 8Explanation:342 + 465 = 807.

When doing problems on websites such as LeetCode, I like to code in my own IDE, that’s why you’ll see some additional helper functions besides the solution code.

```
# Definition for singly-linked list.
class ListNode(object):
def __init__(self, x):
self.val = x
self.next = None
@staticmethod
def make_list(arr):
if len(arr) > 0:
root = ListNode(arr[0])
root.next = ListNode.make_list(arr[1:])
return root
else:
return None
@staticmethod
def print_list(l):
if not l:
return
print(l.val, end=" ")
ListNode.print_list(l.next)
class Solution(object):
def _add_to_list(self, root, val):
while True:
if root.next is None:
root.next = ListNode(val)
break
else:
root = root.next
def _compute(self, result, base=10):
carry = result // base
rest = result % base
return carry, rest
def addTwoNumbers(self, l1, l2):
"""
:type l1: ListNode
:type l2: ListNode
:rtype: ListNode
"""
root_node = None
term_1 = l1
term_2 = l2
saved_carry = 0
while True:
# end of expression ; add cary if any
if term_1 is None and term_2 is None:
if saved_carry > 0:
self._add_to_list(root_node, saved_carry)
break
# We haven't reached the end, we assume that whatever term is left is 0
if term_1 is None:
term_1 = ListNode(0)
if term_2 is None:
term_2 = ListNode(0)
# add the two terms
term_sum_carry, term_sum_no_carry = self._compute(term_1.val + term_2.val)
# add sum to current carry
next_carry, total_with_carry = self._compute(term_sum_no_carry + saved_carry)
# save carry
saved_carry = term_sum_carry + next_carry
# save total
if not root_node:
root_node = ListNode(total_with_carry)
else:
self._add_to_list(root_node, total_with_carry)
# move on
term_1 = term_1.next
term_2 = term_2.next
return root_node
if __name__ == '__main__':
l1 = ListNode.make_list([9, 9])
l2 = ListNode.make_list([1])
solution = Solution()
result = solution.addTwoNumbers(l1, l2)
ListNode.print_list(result)
print("Done")
```

My solution isn’t that great because of the **_add_to_list** function which iterates the root_node to append the next value. I have no idea how to optimize that right now.

UPDATE:

I’ve learnt about **nonlocal** and found a way to slightly optimize my code:

```
def _get_append_func(self, root):
_root = root
def __add_to_list(value):
nonlocal _root
_root.next = ListNode(value)
_root = _root.next
return __add_to_list
```

Thanks for reading!