两数相加
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。