两数相加

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

解题思路:

针对这个题,需要同时遍历两个链表,可以把两个链表看成是相等长度来处理,需要考虑的就是进位的问题,每一次将遍历得到的两个节点的数字相加的时候,都要考虑到上一次两数相加是否有进位的情况,需要把上一次的进位的数字加上去,然后再计算这一次的进位与余数,如果有进位,就留给下一次的节点做运算时使用,另外一个需要考虑的情况就是,当我们遍历完两个链表之后,如果发现还有一个进位,就需要把进位的作为一个新的节点插入到新链表的尾部。

代码实现:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

struct ListNode{
    int val;
    struct ListNode *next;
};

struct ListNode * addTwoNumbers(struct ListNode *l1, struct ListNode *l2){
    struct ListNode *head=NULL;
    struct ListNode *tail=NULL;
    struct ListNode *l1_list=l1;
    struct ListNode *l2_list=l2;
    int carry=0,sum=0;
    
    while(l1_list!=NULL || l2_list!=NULL){
        int x=l1_list!=NULL?l1_list->val:0;
        int y=l2_list!=NULL?l2_list->val:0;
        sum=x+y+carry;
        carry=sum/10;
        sum=sum%10;
        struct ListNode * node=malloc(sizeof(struct ListNode));
        node->val=sum;
        node->next=NULL;
        if(tail){
            tail->next=node;
            tail=node;
        }else{
            tail=head=node;
        }

        if(l1_list!=NULL){
            l1_list=l1_list->next;
        }

        if(l2_list!=NULL){
            l2_list=l2_list->next;
        }
    }

    if(carry == 1){
        struct ListNode * node=malloc(sizeof(struct ListNode));
        node->val=carry;
        node->next=NULL;

        if(tail){
            tail->next=node;
            tail=node;
        }else{
            head=tail=node;
        }

    }
    
    return head;
}

int main(int argc, char ** argv){
    struct ListNode * l1=NULL;
    struct ListNode * l1_tail=NULL;
    struct ListNode * l2=NULL;
    struct ListNode * l2_tail=NULL;
    int x=atoi(argv[1]);
    int y=atoi(argv[2]);
    int tmp_x=x;
    int tmp_y=y;

    while(tmp_x!=0){
        int get_last=tmp_x%10;
        tmp_x=tmp_x/10;
        struct ListNode *node=malloc(sizeof(struct ListNode));
        node->val=get_last;
        node->next=NULL;
        if(l1_tail){
            l1_tail->next=node;
            l1_tail=node;    
        }else{
            l1_tail=l1=node;
        }
    }

    while(tmp_y!=0){
        int get_last=tmp_y%10;
        tmp_y=tmp_y/10;
        struct ListNode *node=malloc(sizeof(struct ListNode));
        node->val=get_last;
        node->next=NULL;
        if(l2_tail){
            l2_tail->next=node;
            l2_tail=node;    
        }else{
            l2_tail=l2=node;
        }
    }
    
    struct ListNode * sum_list=NULL;
    sum_list=addTwoNumbers(l1,l2);
    while(sum_list!=NULL){
        struct ListNode *node=sum_list;
        printf("%d->", node->val);
        sum_list=sum_list->next;
        free(node);
    }
    
}

该代码包含了测试代码,可以直接运行,只要把需要运算的数字作为参数传入就可以, 例如 ./a.out 123  3467。



来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

posted on 2020-03-03 22:33  PigDragon  阅读(271)  评论(0编辑  收藏  举报