/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
typedef struct ListNode node;
void insertion(node**head,node*list){
  node *t = *head ;
  if(!t){
    *head = list;
    return ;
  }
  while(t->next)
    t = t->next;
    t->next = list ;
    return ;
}
void reverse(node** ptr){
      node *temp ,*p,*n;
        temp = *ptr;
        p = NULL;
        while (temp != NULL) {
            n = temp->next ;
            temp->next = p;
            p = temp;
            temp = n;
        }
        *ptr = p;
      
}
node* operation(int a, int b,int*c){
      node *temp = (node*)malloc(sizeof(node)) ;
      
      int ran = a + b;
      temp->val = (ran + *c) <= 10 ? (ran + *c)%10 :  (ran + *c) - 10 ;
      temp->next = NULL;
      *c = (ran + *c) >= 10 ? 1: 0;
      // printf("%d %d\n",temp->val,ran );
      return temp ;
}
node* addTwoNumbers(node* l1, node* l2){
    node *head = NULL;
    // reverse(&l1);
    // reverse(&l2);
    int carry = 0;
    while(l1 || l2){
        
        if(l1 && l2){
          node *temp =  operation(l1->val, l2->val,&carry) ;
             insertion(&head,temp);    
        }else{
          if(l1){
            node *temp =  operation(l1->val, 0,&carry) ;
             insertion(&head,temp);    
              
          }else{
            node *temp =  operation(0, l2->val,&carry) ;
             insertion(&head,temp);    
              
          }
        }
        if (l1) {
          l1 = l1->next; 
        } 
        if (l2){ 
          l2 = l2->next; 
        }
        
         
    }
    if(carry == 1){
      node *temp =  operation(0, 0 ,&carry) ;
      insertion(&head,temp);    
    }
    
    return head;
}