Saturday, December 5, 2009

To add two long positive numbers (each represented by linked lists in C)

Problem

You have two numbers represented by a linked list, where each node contains a single digit. The digits are stored in reverse order, such that the 1’s digit is at the head of the list. Write a function that adds the two numbers and returns the sum as a linked list.

EXAMPLE
Input: (3 -> 1 -> 5) + (5 -> 9 -> 2)
Output: 8 -> 0 -> 8


INPUT:     (2 -> 4 -> 3) + (5 -> 6 -> 4) (i.e. 342 + 465)
OUTPUT: 7 -> 0 -> 8 (i.e. 342 + 465 = 807)

Points to consider

  • We should not forget the carry, especially when we have one more digit just for the carry. (e.g., 5 + 7 = 12, the ’1′ in 12 is due to the carry from last digit) 
  • Two numbers might not be of the same number of digits. (e.g., 7 + 3456 are 1 digit and 4 digit number)
  • As the link list are reversed that of number, we have taken care of adding it from right to left i.e. least significant digit to most significant digit.
There are generally three cases needed to be handled:
  • digit1 and digit2 are neigher null
  • digit1 is null
  • digit2 is null
Here is code in c:

node *long_add(mynode *h1, mynode *h2, mynode *h3)    //h3 = h2+h1
{
  node *c, *c1, *c2;
  int sum, carry, digit;

  carry = 0;
  c1 = h1->next;
  c2 = h2->next;

  while(c1 != h1 && c2 != h2)
  {
     sum   = c1->value + c2->value + carry;
     digit = sum % 10;
     carry = sum / 10;

     h3 = insertNode(digit, h3);

     c1 = c1->next;
     c2 = c2->next;
  }

  if(c1 != h1)
  {
     c = c1;
     h = h1;
  }
  else
  {
     c = c2;
     h = h2;
  }

  while(c != h)
  {
    sum   = c->value + carry;
    digit = sum % 10;
    carry = sum / 10;
    h3 = insertNode(digit, h3);
    c = c->next;
  }

  if(carry==1)
  {
     h3 = insertNode(carry, h3);
  }

  return(h3);
}

Thanks.
More here - http://stackoverflow.com/questions/6960880/adding-two-linked-lists-efficiently-in-c

0 comments:

Post a Comment