* Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */

class Solution {
public:
    /**
     * 
     * @param head1 ListNode类 
     * @param head2 ListNode类 
     * @return ListNode类
     */
    ListNode* reserve(ListNode* head){
        ListNode* l=NULL;
        ListNode* r=head->next;
        while(head){
            head->next=l;
            l=head;
            head=r;
            r=head->next;
        }
        return l;
    }
    ListNode* addInList(ListNode* head1, ListNode* head2) {
        // write code here
        head1=reserve(head1);
        head2=reserve(head2);
        ListNode* cur;
        ListNode* p;
        ListNode* q;
        cur=new ListNode(-1);
        q=cur;
    //    return head1;
        int k=0,f=0;
        while(head1||head2||f){
            if(head1&&head2){
                if(head1->val+head2->val+f<10){
                    p=new ListNode(head1->val+head2->val+f);
                    q->next=p;
                    if(f)
                        f=0;
                }
                else {
                    p=new ListNode(head1->val+head2->val+f-10);
                    q->next=p;
                    f=1;
                }
                head1=head1->next;
                head2=head2->next;
            }
            else if(head1&&!head2){
                if(head1->val+f<10){
                    p=new ListNode(head1->val+f);
                    q->next=p;
                    if(f)
                        f=0;
                }
                else {
                    p=new ListNode(head1->val+f-10);
                    q->next=p;
                    f=1;
                }
                head1=head1->next;
            }
            else if(!head1&&head2){
                if(head2->val+f<10){
                    p=new ListNode(head2->val+f);
                    q->next=p;
                    if(f)
                        f=0;
                }
                else {
                    p=new ListNode(head2->val+f-10);
                    q->next=p;
                    f=1;
                }
                head2=head2->next;
            }
            else if(!head1&&!head2&&f){
                q->next=new ListNode(f);
                f=0;
            }
            q=q->next;
        }
        return reserve(cur->next);
    }
};