-
Notifications
You must be signed in to change notification settings - Fork 160
Expand file tree
/
Copy pathleetcode_2_AddTwoNumbers.py
More file actions
60 lines (53 loc) · 1.77 KB
/
Copy pathleetcode_2_AddTwoNumbers.py
File metadata and controls
60 lines (53 loc) · 1.77 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# Given two linked lists representing 2 numbers, digits are stored in reverse order. Add both and return result as list
# Example: (2->4->3) + (5->6->4), so numbers are 342 + 465 = 807, so result is (7->0->8)
# Ref: https://www.youtube.com/watch?v=sUicrnHwA0s&list=PLiC1doDIe9rDFw1v-pPMBYvD6k1ZotNRO&index=2
# Definition of singly-linked list
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
# # make numbers from lists
# # add them
# # deconstruct list from result
# def make_num(l):
# result = 0
# for i in l:
# result += i * 10**i
# return result
#
# def make_list(num):
# while num:
# digit = num % 10
# l = ListNode(digit)
# num //= 10
#
# return l
#
# def addTwoNumbers(l1,l2):
# num1 = make_num(l1)
# num2 = make_num(l2)
# result = num1 + num2
# position wise addition, and carry forward if necessary
def addTwoNumbers(l1, l2):
added = ListNode(val=(l1.val + l2.val) % 10)
carry_over = (l1.val + l2.val) // 10
current_node = added
while (l1.next and l2.next):
l1 = l1.next
l2 = l2.next
current_node.next = ListNode(val=(carry_over + l1.val + l2.val) % 10)
carry_over = (carry_over + l1.val + l2.val) // 10
current_node = current_node.next
while(l1.next):
l1 = l1.next
current_node.next = ListNode(val=(carry_over + l1.val) % 10)
carry_over = (carry_over + l1.val ) // 10
current_node = current_node.next
while(l2.next):
l2 = l2.next
current_node.next = ListNode(val=(carry_over + l2.val) % 10)
carry_over = (carry_over + l2.val ) // 10
current_node = current_node.next
if carry_over > 0:
current_node.next = ListNode(val=1)
return added