Add two numbers represented by linked lists (in reverse order)



// Definition for singly-linked list.
struct ListNode 
{
     int val;
     struct ListNode *next;
};

struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) 
{    
    int a=0;
    int b=0;
    int sum=0;
    int carry=0;
    struct ListNode* resultRoot = NULL;
    struct ListNode* previousNode = NULL;
    
    if(l1 == NULL)
    return l2;
    
    if(l2 == NULL)
    return l1;
    
    while(l1 != NULL || l2 != NULL || carry > 0)
    {
        struct ListNode* node = (struct ListNode *)malloc(sizeof(struct ListNode));
        
        a = (l1 != NULL)? l1->val: 0;
        b = (l2 != NULL)? l2->val: 0;
        
        sum   = (carry+a+b)%10;
        carry = ((carry+a+b)>9)?1:0;
        
        node->val = sum;
        node->next = NULL;
        
        // For the first node.
        if (resultRoot == NULL)
        {
            resultRoot = node;
            previousNode = node;
        }
        else
        {
            previousNode->next = node;
            previousNode = node;
        }
        
        l1= (l1!=NULL)? l1->next: l1;
        l2= (l2!=NULL)? l2->next: l2;
    }
    
    return resultRoot;
}

void printList(struct ListNode* root)
{
 while(root!=NULL)
 {
  printf("%d ",root->val);
  root = root->next;
 }
 printf("\n");
}

main()
{
 // List-1 (9,9,9)
 struct ListNode* node1 = (struct ListNode *)malloc(sizeof(struct ListNode));
 node1->val=9;
 node1->next=(struct ListNode *)malloc(sizeof(struct ListNode));
 node1->next->val=9;
 node1->next->next=(struct ListNode *)malloc(sizeof(struct ListNode));
 node1->next->next->val=9;
 node1->next->next->next=NULL; 
 printList(node1);
 
 // List-1 (9,9,9)
 struct ListNode* node2 = (struct ListNode *)malloc(sizeof(struct ListNode));
 node2->val=9;
 node2->next=(struct ListNode *)malloc(sizeof(struct ListNode));
 node2->next->val=9;
 node2->next->next=(struct ListNode *)malloc(sizeof(struct ListNode));
 node2->next->next->val=9;
 node2->next->next->next=NULL;
 printList(node2);
 
 // Sum of both lists.
 printList(addTwoNumbers(node1,node2));
}

No comments:

Post a Comment