您的位置:首页 > 其它

LeetCode每日一题 009 两数相加

2019-03-06 23:46 330 查看

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

1、解题思路

链表表示整数逆序存储,每个节点只存储一位数组,因此只需同时顺序遍历两个链表,按位相加并向前进位 即可得到相加后的值。需注意进位值,及链表可能不等长,以及最后可能的进位值得存储。

2、边界用例

1)【2】【9, 9,9】

3、有效题解

[code]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、编写循环不要忘记 循环变量更新 及循环退出条件;

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: