Skip to content

Instantly share code, notes, and snippets.

@igorLisovitskiy
Created September 2, 2021 15:30
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save igorLisovitskiy/8099dd05091850ce66a4d0ce29e9b97d to your computer and use it in GitHub Desktop.
Save igorLisovitskiy/8099dd05091850ce66a4d0ce29e9b97d to your computer and use it in GitHub Desktop.
# Definition for singly-linked list.
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
class Solution:
def addTwoNumbers(self, l1, l2) -> Optional[ListNode]:
return self.get_sum_linked_list(l1, l2)
def split_sum_to_nodes(self, nodes_sum):
if nodes_sum < 10:
return ListNode(nodes_sum), 0
else:
return ListNode(nodes_sum % 10), 1
def get_nodes_sum(self, node_1, node_2, carried_over: int):
if node_1 and node_2:
carried_over += node_1.val + node_2.val
elif node_1:
carried_over += node_1.val
elif node_2:
carried_over += node_2.val
return carried_over
def get_sum_linked_list(self, node_1, node_2, carry_over=0):
next_1 = node_1.next if node_1 else None
next_2 = node_2.next if node_2 else None
node_from_sum_split = None
nodes_sum = self.get_nodes_sum(node_1, node_2, carry_over)
if nodes_sum is not None:
node_from_sum_split, carry_over = self.split_sum_to_nodes(nodes_sum)
elif carry_over > 0:
# no nodes left checking carry over
node_from_sum_split = ListNode(carry_over)
if not next_1 and not next_2 and carry_over == 0:
return node_from_sum_split
else:
node_from_sum_split.next = self.get_sum_linked_list(next_1, next_2, carry_over)
return node_from_sum_split
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment