-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathaddingTwoLinkedListsDigitWise.cpp
More file actions
113 lines (92 loc) · 2.88 KB
/
addingTwoLinkedListsDigitWise.cpp
File metadata and controls
113 lines (92 loc) · 2.88 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
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
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
private:
ListNode* reverseLinkedList( ListNode* head){
ListNode* prev = nullptr;
ListNode* curr = head;
ListNode* ahead;
while(curr){
ahead = curr->next;
curr->next = prev;
prev = curr;
curr = ahead;
}
return prev;
}
void printNodes(ListNode* head){
ListNode* curr = head;
while(curr){
cout << curr->val<<" ";
curr = curr->next;
}
cout <<endl;
return;
}
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
if(!l1) return l2;
if(!l2) return l1;
//Reversing both the Linked Lists so that the carry can be forwarded easily
ListNode * rev1 = reverseLinkedList(l1);
ListNode * rev2 = reverseLinkedList(l2);
ListNode* newHead= nullptr, *iterNewHead=nullptr;
ListNode* iterRev1 = rev1, *iterRev2 = rev2;
int carry =0;
while(iterRev1 && iterRev2){
int newVal = iterRev1->val + iterRev2->val +carry;
if(newVal >9){
carry = newVal/10;
newVal = newVal%10;
}
else{
carry =0;
}
iterNewHead = new ListNode(newVal);
iterNewHead->next = newHead;
newHead = iterNewHead;
iterRev1 = iterRev1->next;
iterRev2 = iterRev2->next;
}
while(iterRev1){
int newVal = iterRev1->val + carry;
if(newVal >9){
carry = newVal/10;
newVal = newVal%10;
}
else{
carry =0;
}
iterNewHead = new ListNode(newVal);
iterNewHead->next = newHead;
newHead = iterNewHead;
iterRev1 = iterRev1->next;
}
while(iterRev2){
int newVal = iterRev2->val + carry;
if(newVal >9){
carry = newVal/10;
newVal = newVal%10;
}
else{
carry =0;
}
iterNewHead = new ListNode(newVal);
iterNewHead->next = newHead;
newHead = iterNewHead;
iterRev2 = iterRev2->next;
}
if(carry){
iterNewHead = new ListNode(carry);
iterNewHead->next = newHead;
newHead = iterNewHead;
}
return newHead ;
}
};