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