/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 * };
 *
 * C语言声明定义全局变量请加上static,防止重复定义
 */

/**
 * 
 * @param head1 ListNode类 
 * @param head2 ListNode类 
 * @return ListNode类
 */

/*
1.先将链表进行反转,然后按每个节点进行计算
*/
struct ListNode* ReverseList(struct ListNode* pHead){
    struct ListNode* tmp = NULL;
    struct ListNode* save = NULL;
    struct ListNode* ReverseList = pHead;
    struct ListNode* p = pHead;
    
    if(pHead == NULL)
        return pHead;
    while(p != NULL){
        save = p->next;
        p->next = tmp;
        tmp = p;
        p = save;
    }
    ReverseList = tmp;
    return ReverseList;
}

// struct ListNode* addInList(struct ListNode* head1, struct ListNode* head2 ) {
//     // write code here
//     struct ListNode* Head;
//     struct ListNode* L1 = head1;
//     struct ListNode* L2 = head2;
//     struct ListNode* p = L1;
//     struct ListNode* q = L2;
//     struct ListNode* s;
//     struct ListNode* tmp = NULL;
//     int remainder = 0;
//     int p_val = 0;
//     int q_val = 0;
    
//   if(head1 == NULL && head2 != NULL)
//         return head2;
//   if(head2 == NULL && head1 != NULL)
//         return head1;
//     L1 = ReverseList(head1);
//     L2 = ReverseList(head2);
//     p = L1;
//     q = L2;
//     /*头插法 创建节点*/
// while(p != NULL || q != NULL){
//         /* 创建节点并为该节点赋值*/
//     remainder = 0; //remainder 用来存放进位数据
//     if(p != NULL){
//         remainder += p->val;
//         p = p->next;
//     }
//     if(q != NULL){
//         remainder += q->val;
//         q = q->next;
//     }
//     s = (struct ListNode*)malloc(sizeof(struct ListNode));
//     s->val = 0;
//     s->next = NULL;
// //     if(p->val + q->val +remainder> 10){
// //         remainder = 1;
// //         //s->val = (p->val + q->val)%10;
// //     }
// //     if((p->val + q->val + remainder)%10 == 0){
// //         remainder = 1;
// //         s->val = 0;
// //     }
// //     if((p->val + q->val + remainder) < 10){
// //         remainder = 0;
// //         s->val = p->val + q->val + remainder;
// //     }
// //         s->next = tmp;
// //         tmp = s;
// //         p = p->next;
// //         q = q->next;
// //     }
// //      /* 如果p->next 或者 q->next有一个 == NULL*/
// //     if(p->val + q->val + remainder >= 10){
// //         s = (struct ListNode*)malloc(sizeof(struct ListNode));
// //         s->val = (p->val + q->val + remainder)%10;
// //         s->next = tmp;
// //         tmp = s;
// //         s = (struct ListNode*)malloc(sizeof(struct ListNode));
// //         s->val = 1;
// //         s->next = tmp;
// //         tmp = s;
// //     }
// //       while(p != NULL || q != NULL){
// //           if(p->val + q->val + remainder < 10){
// //               if(p->next != NULL || q->next != NULL || p != NULL || q != NULL){
// //                     s = (struct ListNode*)malloc(sizeof(struct ListNode));
// //                     s->val = (p->val + q->val + remainder) %10;
// //                     s->next = tmp;
// //                     tmp = s;    
// //               }
// //         }
// //         if(p->val + q->val + remainder == 10){    //如果节点相加大于10, remainder = 1
// //             if(p->next != NULL || q->next != NULL || p != NULL || q != NULL){
// //                     s = (struct ListNode*)malloc(sizeof(struct ListNode));
// //                     s->val = (p->val + q->val + remainder) %10;
// //                     s->next = tmp;
// //                     tmp = s;
// //             }
// //             remainder = 1;
// //             p = p->next;
// //             q = q->next;
    
//     //求出进位
//     remainder = 
    
//     }
//     Head = tmp;
//     return Head;
// }
struct ListNode* addInList(struct ListNode* head1, struct ListNode* head2 ) {
    // write code here
    struct ListNode* Head;
    struct ListNode* L1 = head1;
    struct ListNode* L2 = head2;
    struct ListNode* p = L1;
    struct ListNode* q = L2;
    struct ListNode* s;
    struct ListNode* NewHead ;
    struct ListNode* TempNode;
    int remainder = 0;
    int p_val = 0;
    int q_val = 0;
    
  if(head1 == NULL && head2 != NULL)
        return head2;
  if(head2 == NULL && head1 != NULL)
        return head1;
    L1 = ReverseList(head1);
    L2 = ReverseList(head2);
    p = L1;
    q = L2;
    /*头插法 创建节点*/
    int tmp = 0;
    NewHead = (struct ListNode*)malloc(sizeof(struct ListNode));
    TempNode = NewHead;
while(p != NULL || q != NULL){
            /* 创建节点并为该节点赋值*/
       //remainder用来累加此时的数值(加数+加数+上一位的进位)
        int remainder = tmp;
        //当节点不为空的时候,则需要加上当前节点的值
        if(p != NULL){
            remainder += p->val;
            p = p->next;
        }
        if(q != NULL){
            remainder += q->val;
            q = q->next;
        }
        //求出进位
        tmp = remainder/10;
        //进位后剩下的数值即为当前节点的数值
        s = (struct ListNode*)malloc(sizeof(struct ListNode));
        s->val = remainder%10;
        TempNode->next = s;
        TempNode = s;
    }
    
    //最后当两条链表都加完的时候,进位不为0的时候,则需要再加上这个进位
    if(tmp > 0){
        s = (struct ListNode*)malloc(sizeof(struct ListNode));
    }
    
    //重新翻转链表
    TempNode = NewHead;
    NewHead = NewHead->next;
    TempNode->next = NULL;
    free(TempNode);
    NewHead = ReverseList(NewHead);
    return NewHead;

    
//     if(p->val + q->val +remainder> 10){
//         remainder = 1;
//         //s->val = (p->val + q->val)%10;
//     }
//     if((p->val + q->val + remainder)%10 == 0){
//         remainder = 1;
//         s->val = 0;
//     }
//     if((p->val + q->val + remainder) < 10){
//         remainder = 0;
//         s->val = p->val + q->val + remainder;
//     }
//         s->next = tmp;
//         tmp = s;
//         p = p->next;
//         q = q->next;
//     }
//      /* 如果p->next 或者 q->next有一个 == NULL*/
//     if(p->val + q->val + remainder >= 10){
//         s = (struct ListNode*)malloc(sizeof(struct ListNode));
//         s->val = (p->val + q->val + remainder)%10;
//         s->next = tmp;
//         tmp = s;
//         s = (struct ListNode*)malloc(sizeof(struct ListNode));
//         s->val = 1;
//         s->next = tmp;
//         tmp = s;
//     }
//       while(p != NULL || q != NULL){
//           if(p->val + q->val + remainder < 10){
//               if(p->next != NULL || q->next != NULL || p != NULL || q != NULL){
//                     s = (struct ListNode*)malloc(sizeof(struct ListNode));
//                     s->val = (p->val + q->val + remainder) %10;
//                     s->next = tmp;
//                     tmp = s;    
//               }
//         }
//         if(p->val + q->val + remainder == 10){    //如果节点相加大于10, remainder = 1
//             if(p->next != NULL || q->next != NULL || p != NULL || q != NULL){
//                     s = (struct ListNode*)malloc(sizeof(struct ListNode));
//                     s->val = (p->val + q->val + remainder) %10;
//                     s->next = tmp;
//                     tmp = s;
//             }
//             remainder = 1;
//             p = p->next;
//             q = q->next;
    
    
//     }
//     Head = tmp;
//     return Head;
}