LeetCode #2 两数相加
本文章是对LeetCode #2 两数相加的经验总结。
题目如下:
给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。
你可以假设除了数字 0 之外,这两个数字都不会以零开头。
示例:
输入:
[2,4,3]
[5,6,4]
输出:[7,0,8]
原因:342 + 465 = 807
第一次 失败的尝试
代码如下:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
typedef struct ListNode LinkList;
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2)
{
int tmp, carry, l1val = l1->val, l2val = l2->val;
LinkList *p, *pre, *l3 = NULL;
while (1)
{
p = (LinkList*)malloc(sizeof(LinkList));
if (l3 == NULL)
{
l3 = p;
pre = p;
}
else
{
pre->next = p;
pre = pre->next;
}
pre->next = NULL;
tmp = l1val + l2val + carry;
if(tmp > 9)
{
carry = tmp;
tmp = tmp % 10;
carry = (carry - tmp) / 10;
}
pre->val = tmp;
if (l1->next == NULL && l2->next == NULL)
break;
if (l1->next != NULL)
{
l1val = l1->next->val;
l1 = l1->next;
}
else
l1val = 0;
if (l2->next != NULL)
{
l2val = l2->next->val;
l2 = l2->next;
}
else
l2val = 0;
}
return l3;
}
题目输入两个单链表:l1
和l2
,我的思路是从头开始逐项相加,如果得到的和是两位数,则将进位放入carry
中。
这次尝试的问题是:我设置了进位,但在判定逐项相加是否结束(即两个链表的下一项是否都为空)的时候直接退出循环,而没有把进位再放上去,导致某些测试用例的输出缺少了最后一位。
第二次 成功
发觉上面提到的问题后,我把判定移到了检查进位carry
是否为0之后:如果是,则判断;如果不是,则跳过判断。
下面是代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
typedef struct ListNode LinkList;
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2)
{
int tmp, carry = 0, l1val = l1->val, l2val = l2->val;
LinkList *p, *pre, *l3 = NULL;
while (1)
{
p = (LinkList*)malloc(sizeof(LinkList));
if (l3 == NULL)
{
l3 = p;
pre = p;
}
else
{
pre->next = p;
pre = pre->next;
}
pre->next = NULL;
tmp = l1val + l2val + carry;
carry = 0;
if(tmp > 9)
{
carry = tmp;
tmp = tmp % 10;
carry = (carry - tmp) / 10;
}
pre->val = tmp;
if (carry == 0)
if (l1->next == NULL && l2->next == NULL)
break;
if (l1->next != NULL)
{
l1val = l1->next->val;
l1 = l1->next;
}
else
l1val = 0;
if (l2->next != NULL)
{
l2val = l2->next->val;
l2 = l2->next;
}
else
l2val = 0;
}
return l3;
}
这次的代码跑到了28ms,第二快,但是第二快的代码是最多的。
提供一些测试用例:
- [9,8,9,8,7,8,9,9,5,4,9,9,8,8]
- [9,7,5,8,6,3,4,1,5,8,6,6]
- [0]
- [0]
- [5]
- [5]
- [0,1]
- [0,9]