给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
这道题是把两个整数逆序存到两个链表里,然后把这两个整数相加后的数放到一个新链表中,返回新链表的地址
这里需要注意两个点
1.这俩个整数不一定是一样长度的
例如:21和134
所以我们这里逆序存放就是[1 2 0]和[4 3 1]
要按照长度较长的数字来考虑,把长度较短的后面置为0
2.这两个整数相加需要进位,特别是逆序的最后一位
例如:367和803
逆序存放就是[7 6 3]和[3 0 8]
相加之后是[0 7 5 1]
所以在新的链表中存放数字时要注意是否有进位
具体思路如下:我们遍历两个链表,将对应位置的数字相加,当两个链表的节点里都是0的时候我们就停止遍历,这样就不需要考虑一个链表中数字为0的情况,例如:230和123,我们在遍历的时候要设置一个终止条件,这里俩个方面的考虑,两个数字都是以0结尾的数字或者两个数字的最高位需要进位,这里我们把两个原链表按对应位置相加后的节点依次插入的新链表,然后直到两个原链表都为空并且没有进位数的时候停止循环。
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2)
{
//先创建一个新的链表存放要的结果
//先创建一个哨兵位,用来找到我们新链表的地址
struct ListNode* head=malloc(sizeof(struct ListNode));
//再创建一个指针
//用来指向新链表的最后一个节点
//刚开始指向哨兵位
struct ListNode* cur=head;
//创建一个变量,用来判断是否要进位
//因为两个各位数相加进位值必是1或者0
int a=0;
//遍历两个已给的链表,把对应位置的数字加到新链表上
//把要进位的数字也加到进位的数字上
//考虑一种特殊情况就是最后俩个数字的最高位加起来需要进位
//但是两个链表后面的数字为0
//则要把进位数字表示出来
//需要把进位数字也作为一个判断的条件
while(l1||l2||a)
{
//如果一个链表已经没有数字了
//就把另一个链表的数字加到进位数上去就好了
if(l1)
{
a=a+l1->val;
l1=l1->next;
}
if(l2)
{
a=a+l2->val;
l2=l2->next;
}
cur->next=malloc(sizeof(struct ListNode));
//把进位数取余数是当前的位置上的数
cur->next->val=a%10;
cur->next->next=NULL;
cur=cur->next;
//下一位的进位后的数就是这一位的进位数除10;
a/=10;
}
//把从哨兵位的下一个节点作为头节点返回
return head->next;
}