LeetCode. 两数相加
** 题目描述**
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
考虑:
LeetCode所给的函数是如下所示:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
}
要根据所给的两个逆序链表对数字进行加和。
考虑所给的逆序,虽然不符合平常数字的写法(高位在前),却符合链表的循环遍历(从低位到高位),在这里可以借助vector对数字进行存储。
易错
按照惯例,我们肯定是先把数字得到后,再进行数学运算。
这样明显是错误的,如果数字的位数非常大,程序则不能很好地通过所有的测试样例。此时,考虑加法的简单模拟(用一个变量存储进位值)。
codes:
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2)
{
vector<int> rec1;
vector<int> rec2;
/*
遍历链表,将数值存入vector向量中
*/
while(l1 != NULL)
{
rec1.push_back(l1->val);
l1 = l1->next;
}
while(l2 != NULL)
{
rec2.push_back(l2->val);
l2 = l2->next;
}
ListNode *result = NULL;
ListNode *sentry = NULL;
/*
两个加数的位数不一定相等,考虑低位对齐
*/
int _max = (rec1.size()>rec2.size())?rec1.size():rec2.size();
int _min = (rec1.size()<rec2.size())?rec1.size():rec2.size();
//temp存储进位的值
int temp = 0;
int i = 0;
/*
简单模拟两个数进行加法运算
*/
for(;i < _min;i++)
{
int value = rec1[i] + rec2[i] + temp;
if(value >= 10)
{
temp = value / 10;
value = value % 10;
}
else
temp = 0;
/*
i=0时第一次进入循环,则构建链表。
并用result记住链表头。
之后使用sentry进行迭代操作
*/
if(i == 0)
{
result = new ListNode(value);
sentry = result;
}
else
{
sentry->next = new ListNode(value);
sentry = sentry->next;
}
}
/*
通过flag判断两个加数哪一个的位数较多,
对其单独进行处理(要考虑上面两数加和时的进位)
*/
int flag = 0;
if(rec1.size() > rec2.size())
flag = 1;
for(;i < _max;i++)
{
int value;
if(flag)
{
value = rec1[i] + temp;
}
else
{
value = rec2[i] + temp;
}
temp = value / 10;
value = value % 10;
sentry->next = new ListNode(value);
sentry = sentry->next;
}
/*
temp有可能还有值,则是最后的进位(向高位)。(for example:5+5)
*/
if(temp != 0)
{
sentry->next = new ListNode(temp);
sentry = sentry->next;
}
return result;
}