/**
 * 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* reverse(ListNode* p){
        ListNode *pre = NULL, *cur = p, *next = NULL;
        while(cur){
            next = cur->next;
            cur->next = pre;
            pre = cur;
            cur = next;
        }
        return pre;
    }
    
    ListNode* addInList(ListNode* head1, ListNode* head2) {
        // write code here
        //反转两个链表,从个位相加
        ListNode *p1 = reverse(head1);
        ListNode *p2 = reverse(head2);
        ListNode *res = new ListNode(0);//创建头节点
        ListNode *p3 = res;
        int add = 0;
        while(p1 != NULL || p2 != NULL){//当两个指针不全为空的时候
            int val1 = p1?p1->val:0;//若非空,则取值,若为空,则取0
            int val2 = p2?p2->val:0;
            int sum = val1 + val2 +add;
            add = sum / 10;
            sum -= add*10;//求和,并且进位,add为0则没有进位,为1则进位
            ListNode * node = new ListNode(sum);//创建新节点,并赋值
            p3->next = node;
            p3 = p3->next;
            p1 = p1?p1->next:p1;//非空则下移,空则不动
            p2 = p2?p2->next:p2;
        }
        p3 = res->next;
        res = reverse(res);//反转回来
        p3->next = NULL;//删除头节点
        return res;
    }
};