/**
 * struct ListNode {
 *  int val;
 *  struct ListNode *next;
 * };
 */
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 *
 * @param head1 ListNode类
 * @param head2 ListNode类
 * @return ListNode类
 */
#include <stdlib.h>
struct ListNode* addInList(struct ListNode* head1, struct ListNode* head2 ) {
    // write code here
    if (head1->next == NULL && head2->next == NULL) {  // 两个一位数相加
        head1->val = head1->val + head2->val;
        if (head1->val >= 10) {  // 需要进位
            head1->val = head1->val - 10;
            struct ListNode* p = (struct ListNode*)malloc(sizeof(struct ListNode));
            p->val = 1;
            p->next = head1;  // 头插法
            head1->next = NULL;
            return p;
        } else {  // 不需要进位
            return head1;
        }
    }
    struct ListNode* L1 = (struct ListNode*)malloc(sizeof(struct ListNode));
    L1->next = NULL;
    while (head1 != NULL) {  // 新建L1储存head1的翻转,L1带头结点
        struct ListNode* tmp = (struct ListNode*)malloc(sizeof(struct ListNode));
        tmp->val = head1->val;
        tmp->next = L1->next;
        L1->next = tmp;
        head1 = head1->next;
    }
    struct ListNode* L2 = (struct ListNode*)malloc(sizeof(struct ListNode));
    L2->next = NULL;
    while (head2 != NULL) {  // 新建L2储存head2的翻转,L2带头结点
        struct ListNode* tmp = (struct ListNode*)malloc(sizeof(struct ListNode));
        tmp->val = head2->val;
        tmp->next = L2->next;
        L2->next = tmp;
        head2 = head2->next;
    }
    int jinwei = 0;
    struct ListNode* L = (struct ListNode*)malloc(sizeof(struct ListNode));
    L->next = NULL;  // 新建L储存结果
    struct ListNode* LL1 = L1->next;  // LL1从L1的首元结点开始
    struct ListNode* LL2 = L2->next;  // LL2从L2的首元结点开始
    while (LL1 != NULL && LL2 != NULL) {
        struct ListNode* p = (struct ListNode*)malloc(sizeof(struct ListNode));
        // 新建结点p用来存放两个结点的和
        p->val = LL1->val + LL2->val + jinwei;
        if (p->val >= 10) {  // 两个结点的和需要进位
            p->val = p->val - 10;
            jinwei = 1;
            LL1 = LL1->next;
            LL2 = LL2->next;
        } else {
            jinwei = 0;
            LL1 = LL1->next;
            LL2 = LL2->next;
        }
        p->next = L->next;
        L->next = p;
    }
    // L1和L2可能位数相同,可能L1位数更多,可能L2位数更多
    if (LL1 == NULL && LL2 == NULL) {  // 位数相同
        if (jinwei == 0) {  // 最高位不用再进一位
            return L->next;
        } else {  // 最高位还要再进一位,新的最高位变为1
            struct ListNode* p = (struct ListNode*)malloc(sizeof(struct ListNode));
            p->val = 1;
            p->next = L->next;
            L->next = p;
            return L->next;
        }
    } else if (LL1 != NULL && LL2 == NULL) { // L1比L2长
        while (LL1 != NULL) {
            struct ListNode* p = (struct ListNode*)malloc(sizeof(struct ListNode));
            p->val = LL1->val + jinwei;  // L1的结点和进位数相加
            if (p->val >= 10) {  // 还是要进位,比如9+1
                p->val = p->val - 10;
                jinwei = 1;
                LL1 = LL1->next;
            } else {
                jinwei = 0;
                LL1 = LL1->next;
            }
            p->next = L->next;
            L->next = p;
        }
        if (jinwei == 0) {  // 最高位不用进位
            return L->next;
        } else {  // 最高位还要进位,新的最高位变为1
            struct ListNode* p = (struct ListNode*)malloc(sizeof(struct ListNode));
            p->val = 1;
            p->next = L->next;
            L->next = p;
            return L->next;
        }
    } else if (LL1 == NULL && LL2 != NULL) {  // L2比L1长
        while (LL2 != NULL) {
            struct ListNode* p = (struct ListNode*)malloc(sizeof(struct ListNode));
            p->val = LL2->val + jinwei;
            if (p->val >= 10) {
                p->val = p->val - 10;
                jinwei = 1;
                LL2 = LL2->next;
            } else {
                jinwei = 0;
                LL2 = LL2->next;
            }
            p->next = L->next;
            L->next = p;
        }
        if (jinwei == 0) {
            return L->next;
        } else {
            struct ListNode* p = (struct ListNode*)malloc(sizeof(struct ListNode));
            p->val = 1;
            p->next = L->next;
            L->next = p;
            return L->next;
        }
    }
    return L->next;
}