给定两个用链表表示的整数,每个节点包含一个数位。
这些数位是反向存放的,也就是个位排在链表首部。
编写函数对这两个整数求和,并用链表形式返回结果。
示例:
输入:(7 -> 1 -> 6) + (5 -> 9 -> 2),即617 + 295
输出:2 -> 1 -> 9,即912
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2)
{
struct ListNode head;//创建一个头结点
struct ListNode *tail = &head;//尾指针先指向头结点
head.next = NULL;
//指针p q分别指向l1 l2
struct ListNode *p = l1;
struct ListNode *q = l2;
int tmp = 0;//保存当前值
int jinwei = 0;//保存进位 因为一个位最多1-9 超过2两位数就得进位
while(p!=NULL || q!=NULL)//p q往后走 直到两个都为NULL
{
//判断一个为空另一个继续走
if(p != NULL)
{
tmp += p->val;
p = p->next;
}
if(q != NULL)
{
tmp += q->val;
q = q->next;
}
//当前=当前加上进位
tmp += jinwei;
//创建新节点用来保存这个位的值
struct ListNode* pnewnode = (struct ListNode*)malloc(sizeof(struct ListNode));
pnewnode->val = tmp%10;
//tmp>10则进位+1
jinwei = tmp/10;
//tail最初指向头结点,直接往tail后面插即可
pnewnode->next = tail->next;
tail->next = pnewnode;
//tail后移
tail = pnewnode;//tail=tail->next;
//重置tmp=0
tmp = 0;
}
//判断如果最后一步还有进位1 则再申请个节点 将1赋值插入tail后面
if(jinwei == 1)
{
struct ListNode* pnewnode = (struct ListNode*)malloc(sizeof(struct ListNode));
pnewnode->val = 1;
pnewnode->next = tail->next;
tail->next = pnewnode;
}
//返回第一个有效节点
return head.next;
}