给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807
1、解题思路
链表表示整数逆序存储,每个节点只存储一位数组,因此只需同时顺序遍历两个链表,按位相加并向前进位 即可得到相加后的值。需注意进位值,及链表可能不等长,以及最后可能的进位值得存储。
2、边界用例
1)【2】【9, 9,9】
3、有效题解
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
if (NULL == l1 || NULL == l2)
{
return (NULL == l1) ? l2 : l1;
}
struct ListNode *list = NULL;
struct ListNode *pNode;
struct ListNode *preNode = NULL;
int base = 0;
while (NULL != l1 && NULL != l2)
{
pNode = (struct ListNode *)calloc(1, sizeof(struct ListNode));
assert(NULL != pNode);
base += l1->val + l2->val;
pNode->val = base % 10;
base = base / 10;
pNode->next = NULL;
if (NULL != preNode)
{
preNode->next = pNode;
}
preNode = pNode;
if (NULL == list)
{
list = pNode;
}
l1 = l1->next;
l2 = l2->next;
}
struct ListNode *tmpNode = (NULL == l1) ? l2 : l1;
while (NULL != tmpNode)
{
pNode = (struct ListNode *)calloc(1, sizeof(struct ListNode));
assert(NULL != pNode);
base += tmpNode->val;
pNode->val = base % 10;
base = base / 10;
pNode->next = NULL;
if (NULL != preNode)
{
preNode->next = pNode;
}
preNode = pNode;
tmpNode = tmpNode->next;
}
while (base > 0)
{
pNode = (struct ListNode *)calloc(1, sizeof(struct ListNode));
assert(NULL != pNode);
pNode->val = base % 10;
base = base / 10;
pNode->next = NULL;
if (NULL != preNode)
{
preNode->next = pNode;
}
preNode = pNode;
}
return list;
}
4、复杂度分析
遍历链表,时间复杂度o(n),空间复杂度o(1)。
5、小结
1、如果以独立首节点的形式表示链表,注意修改链表元素要使用指针的指针,才会生效;
2、编写循环不要忘记 循环变量更新 及循环退出条件;