【题目概要】
2. 两数相加
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
【思路分析】
- 以其中任一链表作为最终结果的sum,注意相加的过程中需要维护addflag,以及最终位是否需要进位,新增节点
- 题目中给定条件注意:无空链表,此特殊情况不考虑;无首部的0,每一个链表节点均代表是一位非负数
- 需要考虑重点是两个链表在最后一位相加时,有无进位,有则需要新增一个节点
- 需要考虑是每次相加的进位情况处理
- 函数返回链表的首节点地址,可以在堆空间建立新链表,也可以在传入参数
l1或者l2
的基础上修改原来的链表节点值,同时需要注意链表的长度有可能不够,此时注意连接部分链表,本题目采用直接在l1的基础上修改链表,并返回l1,当l1的长度小于l2时,直接将l1的尾结点链接到l2的当前节点
- 注意在链表遍历的时候,若尾结点需要指向下一个链表的部分,需要拿到ptail,或者采用while(p1->next)的循环结束条件,此时尾结点没有做运算,需在循环外做一次运算
【代码示例】
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
int sumnode(int a, int b, int *flag)
{
int sumtemp = a + b + *flag;
if(sumtemp > 9)
{
sumtemp -= 10;
*flag = 1;
}
else
{
*flag = 0;
}
return sumtemp;
}
void insert(struct ListNode* tail, int val)
{
struct ListNode *temp = (struct ListNode *)malloc(sizeof(struct ListNode));
temp->next = NULL;
temp->val = val;
tail->next = temp;
}
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
struct ListNode *pl1 = l1;
struct ListNode *pl2 = l2;
struct ListNode *pl1tail = NULL;
struct ListNode *ptemp = NULL;
int addflag = 0;
while(pl1 && pl2)
{
pl1->val = sumnode(pl1->val, pl2->val, &addflag);
if(pl1->next == NULL)
pl1tail = pl1;
pl1 = pl1->next;
pl2 = pl2->next;
}
//判断两链表相加之后的结果情况,l1为空,l2为空,同时为空
if(pl1)
ptemp = pl1;
else if(pl2)
{
ptemp = pl2;
pl1tail->next = pl2;
}
else
{
if(addflag)
insert(pl1tail, 1);
return l1;
}
//相加到最后一位之前,因为最后一位可能需要产生新的进位节点
while(ptemp->next)
{
ptemp->val = sumnode(ptemp->val, 0, &addflag);
ptemp = ptemp->next;
}
ptemp->val += addflag;
if(ptemp->val > 9)
{
ptemp->val -= 10;
insert(ptemp, 1);
}
return l1;
}