struct ListNode* ReverseList(struct ListNode* head)
{
    if(head==NULL || head->next==NULL)
    return head;
    else
    {
        struct ListNode *p=head->next,*q;
        head->next=NULL;
        while(p!=NULL)
            {
            q=p->next;
            p->next=head;
            head=p;
            p=q;
            }
    }
            return head;
    
    
}

struct ListNode* addInList(struct ListNode* head1, struct ListNode* head2 ) {
//     // write code here
    struct ListNode *p1=head1,*p2=head2,*p3=NULL,*head3=NULL,*pre;
    int flag=0;
    
    if(p1==NULL)
        return p2;
    
    if(p2==NULL)
        return p1;
    
    p1=ReverseList(head1);
    p2=ReverseList(head2);
    int i=0;
    p3=(struct ListNode*)malloc(sizeof(struct ListNode));
    p3->next=NULL;
    head3=p3;
    while(p1!=NULL&&p2!=NULL)
    {
        p3->val=(p1->val+p2->val+i)%10;
        i=(p1->val+p2->val+i)/10;
        p3->next=(struct ListNode*)malloc(sizeof(struct ListNode));
        pre=p3;
        p3=p3->next;
        p1=p1->next;
        p2=p2->next;
    }
    
    while(p1!=NULL)
    {
        p3->val=(p1->val+i)%10;
        i=(p1->val+i)/10;
        p3->next=(struct ListNode*)malloc(sizeof(struct ListNode));
        pre=p3;
        p3=p3->next;
        p1=p1->next;
    }
    while(p2!=NULL)
    {
        p3->val=(p2->val+i)%10;
        i=(p2->val+i)/10;
        p3->next=(struct ListNode*)malloc(sizeof(struct ListNode));
        pre=p3;
        p3=p3->next;
        p2=p2->next;
    }
    
    if(i!=0)
    {
        p3->val=i;
        p3->next=NULL;
    }
    else
    {
        free(p3);
        pre->next=NULL;
    }
    
    return ReverseList(head3);
}