1.为什么要用两个链表来实现两个数字相加呢
现实生活中出现的很多数字我们无法使用程序语言的数字类型去存储它们,或者说是由于语言数字类型可以存储的数字有限。所以派生出了两种用来存放超级大的数字的方法,一种是用链表来存储;另外是用字符串数组用Leecode的这个题使用的是链表存储
2.对于题目的分析
1.给了我们两个非空的链表,其中链表的存储顺序是按照数字位数的倒序排列的(当然,Leecode没有给我们挖很多坑)
2.返回值类型也是链表,我们需要开辟动态内存去存储两数之和(如果不开辟内存的话,在函数调用结束之后。在此函数有效区间内的变量都会被清空 详情去看一下堆内存和块内存的区别)
3.我们需要考虑是否进位,判断是否要申请更多的一个空间
3.进行程序的编写
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
int flag=0,num=0;//flag来存储是否有进位的产生
struct ListNode* temp=(struct ListNode*)malloc(sizeof(struct ListNode));//相当于是一个头节点
struct ListNode* tail=temp;//临时保存申请到的头节点的位置
while(l1!=NULL||l2!=NULL||flag==1){//当l1和l2或者有进位产生时,循环继续
struct ListNode* temp11=(struct ListNode*)malloc(sizeof(struct ListNode));//每次都申请一个新的节点
tail->next=temp11;//将申请到的新节点拼接到链表后面
temp11->next=NULL;//每次都得给申请到的节点赋空操作
tail=temp11;//把新申请到的节点链表尾部
int a,b;//临时存储相同的位数
a=l1!=NULL?(l1->val):0;//二元表达式判断链表的val值,没有则赋0 下一行相同
b=l2!=NULL?(l2->val):0;
l1=l1!=NULL?(l1->next):NULL;//判断是否为最后的节点,不是则进行下一个;是的话进行赋空
l2=l2!=NULL?(l2->next):NULL;
num=a+b+flag;//相同位数相加
flag=num>=10?1:0;//判断是否需要进位,不需要则赋0
temp11->val=num%10;//将相加后的个位数字赋给申请到节点的val
num=0;//每次循环清空num值
}
return temp->next;//返回动态申请的链表
}