给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外,这两个数都不会以 0 开头。 示例 1: 输入:l1 = [2,4,3], l2 = [5,6,4] 输出:[7,0,8] 解释:342 + 465 = 807. 示例 2: 输入:l1 = [0], l2 = [0] 输出:[0] 示例 3: 输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9] 输出:[8,9,9,9,0,0,0,1] 提示: 每个链表中的节点数在范围 [1, 100] 内 0 <= Node.val <= 9 题目数据保证列表表示的数字不含前导零
先写一个函数用于无视是否为空的从链表中取value
int getValue(struct ListNode* l1)
{
if(l1 != NULL)
{
return l1->val;
}
return 0;
}
?写一个将当前节点分配空间并value相加,保存进位数,其中题目val∈[0,9],因此carry可以是硬编码1,但是这样不是很好。
void addNode(struct ListNode** sum, struct ListNode* l1, struct ListNode* l2, int carry)
{
if(l1 == NULL && l2 == NULL && carry == 0)
{
return;
}
int sumVal = getValue(l1) + getValue(l2) + carry;
int newCarry = sumVal / 10;
sumVal %= 10;
*sum = (struct ListNode *)malloc(sizeof(struct ListNode));
(*sum)->val = sumVal;
(*sum)->next = NULL;
addNode(&((*sum)->next), l1 ? l1->next : NULL, l2 ? l2->next : NULL, newCarry);
}
最后调用自己的函数?
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
struct ListNode *sumList = NULL;
addNode(&sumList, l1, l2, 0);
return sumList;
}
int getValue(struct ListNode* l1)
{
if(l1 != NULL)
{
return l1->val;
}
return 0;
}
void addNode(struct ListNode** sum, struct ListNode* l1, struct ListNode* l2, int carry)
{
if(l1 == NULL && l2 == NULL && carry == 0)
{
return;
}
int sumVal = getValue(l1) + getValue(l2) + carry;
int newCarry = sumVal / 10;
sumVal %= 10;
*sum = (struct ListNode *)malloc(sizeof(struct ListNode));
(*sum)->val = sumVal;
(*sum)->next = NULL;
addNode(&((*sum)->next), l1 ? l1->next : NULL, l2 ? l2->next : NULL, newCarry);
}
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
struct ListNode *sumList = NULL;
addNode(&sumList, l1, l2, 0);
return sumList;
}