思路:将两个链表分别反转,同时新建一个头结点准备链接相加后的值。
然后两个从头开始逐位相加,进位的和留下来准备并入下一个结点的计算中,剩下的值放入一个新建的结点中,并按尾插法链入新表中。
最后把链表反转。
struct ListNode* reverse(struct ListNode* head){   //反转链表的函数
     if(head == NULL)
        return head;
    struct ListNode* cur = head;
    struct ListNode* node = NULL;
    struct ListNode* tmp;
    while(cur != NULL){
        tmp = cur->next;
        cur->next = node;
        node = cur;
        cur = tmp;
    }
    return node;
 }

struct ListNode* addInList(struct ListNode* head1, struct ListNode* head2 ) {
    if(head1 == NULL)
        return head2;
    if(head2 == NULL)
        return head1; 
    head1 = reverse(head1);
    head2 = reverse(head2);
    struct ListNode* head = malloc(sizeof(struct ListNode));  //新头结点
    struct ListNode* phead = head;  //头指针
    int temp = 0;  //放进位和,为0或1
    while(head1 != NULL || head2 != NULL){
        int val = temp;  //初始为上一次的进位,0或者1
        if(head1 != NULL){
            val = val + head1->val;   //加第一个链表的结点值
            head1 = head1->next;
        }
        if(head2 != NULL){
            val = val + head2->val;  //加第二个链表的节点值
            head2 = head2->next;
        }
        temp = val / 10;   //计算进位以备下一次计算用
        struct ListNode* s = malloc(sizeof(struct ListNode));  //新建结点
        s->val = val % 10;   //把上面相加后的个位值放入新结点
        phead->next = s;   //尾插法插入新链表
        phead = s;
    }
    if(temp > 0){   //最后的进位为1,需要多建一个结点
        struct ListNode* s = malloc(sizeof(struct ListNode));
        s->val = temp;  //存最后进位的那个1
        phead->next = s;
    }
    return reverse(head->next);  //反转之后即为结果链
}