Problem: Given two numbers represented by two linked lists, write a method that returns linked list representing the addition of two input numbers.
Solution: No need to explain. Can be easily understood by the implementation.
Implementation:
//All of these methods are friends to List class
void addAtFront(List::ListNode*& head, int num)
{
List::ListNode* newNode = new List::ListNode(num, head);
head = newNode;
}
void addCarry(List::ListNode* node1, List::ListNode* node2, int& carry, List::ListNode *&result)
{
if(node1 != node2)
{
addCarry(node1->next, node2, carry, result);
int sum = node1->data + carry;
carry = sum/10;
sum = sum % 10;
addAtFront(result, sum);
}
}
List::ListNode* addSameLenNum(List::ListNode* node1, List::ListNode* node2, int& carry)
{
if(!node1)
return NULL;
List::ListNode *node = new List::ListNode();
node->next = addSameLenNum(node1->next, node2->next, carry);
int sum = node1->data + node2->data + carry;
carry = sum / 10;
node->data = sum % 10;
return node;
}
List* addNum(List l1, List l2)
{
if(!l1.head)
{
return new List(l2);
}
if(!l2.head)
{
return new List(l1);
}
List* result = new List()
List::ListNode *head1 = l1.head, *head2 = l2.head;
int len1 = l1.len, len2 = l2.len;
int carry = 0;
if(len1 == len2)
result->head = addSameLenNum(l1.head, l2.head, carry);
else
{
if(len1 < len2)
{
head1 = l2.head;
head2 = l1.head;
}
int diff = std::abs(len1 - len2);
List::ListNode* curr = head1;
for(int i = 0; i < diff; ++i, curr=curr->next);
result->head = addSameLenNum(curr, head2, carry);
addCarry(head1, curr, carry, result->head);
}
if(carry)
addAtFront(result->head, carry);
return result;
}
Complexity: O(n)
No comments:
Post a Comment