/**
 * struct ListNode {
 *  int val;
 *  struct ListNode *next;
 * };
 */
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 *
 * @param head1 ListNode类
 * @param head2 ListNode类
 * @return ListNode类
 */
struct ListNode* addInList(struct ListNode* head1, struct ListNode* head2 ) {
    //思路(由于结点数量最大1000000个,因此不可用数字转换方法)
    //将两个链表逆转,方便从低位开始计算
    //从二者低位开始相加,每次记录是否满10,若满10则在二者的下一位计算中加入1
    //创建新链表放置结果

    struct ListNode* nodeTmp = NULL;
    struct ListNode* reverse1Node = NULL;
    struct ListNode* reverse2Node = NULL;
    struct ListNode reverseHead1Node = { .next = head1 };
    struct ListNode reverseHead2Node = { .next = head2 };
    struct ListNode resultHeadNode = { .next = NULL };
    int numberTmp = 0;
    char upToTen = 0;

    //逆转链表1
    nodeTmp = head1->next;
    while (head1->next) {
        head1->next = nodeTmp->next;
        nodeTmp->next = reverseHead1Node.next;
        reverseHead1Node.next = nodeTmp;
        nodeTmp = head1->next;
    }
    //逆转链表2
    nodeTmp = head2->next;
    while (head2->next) {
        head2->next = nodeTmp->next;
        nodeTmp->next = reverseHead2Node.next;
        reverseHead2Node.next = nodeTmp;
        nodeTmp = head2->next;
    }

    //计算生成结果链表
    reverse1Node = reverseHead1Node.next;
    reverse2Node = reverseHead2Node.next;
    while (reverse1Node != NULL || reverse2Node != NULL) {
        if (reverse1Node != NULL && reverse2Node != NULL) {
            //将链表结点从开到尾,两两相加
            numberTmp = reverse1Node->val + reverse2Node->val;
            //移动链表指针
            reverse1Node = reverse1Node->next;
            reverse2Node = reverse2Node->next;
        } else {
            //其中一个链表已经遍历结束,则只计算另一链表的剩余结点
            if (reverse1Node == NULL) {
                numberTmp = 0 + reverse2Node->val;
                reverse2Node = reverse2Node->next; // 移动链表指针
            } else if (reverse2Node == NULL) {
                numberTmp = reverse1Node->val + 0;
                reverse1Node = reverse1Node->next; // 移动链表指针
            }
        }
        //创建新结点
        numberTmp += upToTen;
        nodeTmp = (struct ListNode*)malloc(sizeof(struct ListNode));
        nodeTmp->val = numberTmp % 10;
        nodeTmp->next = resultHeadNode.next;
        resultHeadNode.next = nodeTmp;
        //满十进一
        if (numberTmp > 9) {
            upToTen = 1;
        } else {
            upToTen = 0;
        }
    }
    //最后一次计算满十,需要增加一个结点
    if(upToTen == 1) {
        nodeTmp = (struct ListNode*)malloc(sizeof(struct ListNode));
        nodeTmp->val = 1;
        nodeTmp->next = resultHeadNode.next;
        resultHeadNode.next = nodeTmp;
    }
    return resultHeadNode.next;
}