-
Notifications
You must be signed in to change notification settings - Fork 0
/
addition of linkedlist.py
125 lines (94 loc) · 2.58 KB
/
addition of linkedlist.py
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
# Python program to add two numbers represented by linked list
# Node class
class Node:
# Constructor to initialize the node object
def __init__(self, data):
self.data = data
self.next = None
class LinkedList:
# Function to initialize head
def __init__(self):
self.head = None
# Function to reverse the linked list
def reverse(self):
prev = None
current = self.head
while(current is not None):
next = current.next
current.next = prev
prev = current
current = next
self.head = prev
# Function to insert a new node at the beginning
def push(self, new_data):
new_node = Node(new_data)
new_node.next = self.head
self.head = new_node
# Add contents of two linked lists and return the head
# node of resultant list
def addTwoLists(self, first, second):
prev = None
temp = None
carry = 0
# While both list exists
while(first is not None or second is not None):
# Calculate the value of next digit in
# resultant list
# The next digit is sum of following things
# (i) Carry
# (ii) Next digit of first list (if ther is a
# next digit)
# (iii) Next digit of second list ( if there
# is a next digit)
fdata = 0 if first is None else first.data
sdata = 0 if second is None else second.data
Sum = carry + fdata + sdata
# update carry for next calculation
carry = 1 if Sum >= 10 else 0
# update sum if it is greater than 10
Sum = Sum if Sum < 10 else Sum % 10
# Create a new node with sum as data
temp = Node(Sum)
# if this is the first node then set it as head
# of resultant list
if self.head is None:
self.head = temp
else:
prev.next = temp
# Set prev for next insertion
prev = temp
# Move first and second pointers to next nodes
if first is not None:
first = first.next
if second is not None:
second = second.next
if carry > 0:
temp.next = Node(carry)
# Utility function to print the linked LinkedList
def printList(self):
temp = self.head
while(temp):
print(temp.data)
temp = temp.next
# Driver code
first = LinkedList()
second = LinkedList()
# Create first list
first.push(6)
first.push(4)
first.push(9)
first.push(5)
first.push(7)
print("First List is ")
first.printList()
# Create second list
second.push(4)
second.push(8)
print("\nSecond List is ")
second.printList()
first.printList()
# Add the two lists and see result
res = LinkedList()
res.addTwoLists(first.head, second.head)
print("\nResultant list is ")
res.printList()