leetcode神评曾言道:
有人相爱,有人也里开车看海,有人leetcode第一题做不出来。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2)
{
ListNode *l3 = new ListNode(0);//分配空间
ListNode *ans = l3;//这里分配一个活动的指针
int len1, len2, len;//链表1的长度,链表2的长度,最大的长度
len1 = read(l1);
len2 = read(l2);//读取长度
len = max(len1, len2);//比较
if (len1 < len2)//平齐,len1 = len2就不要了,算是省一点点时间吧,不过没有什么用-_-
{
put_zero(l1, len1, len);
}
else if (len2 < len1)
{
put_zero(l2, len2, len);
}
int cnt, r;//cnt是对应位数的和,r是余数
r = 0;//初始化
for (int i = 1; i <= len; i++)
{
ans->next = new ListNode(0);//新开内存
ans = ans->next;//前进一个单位
cnt = l1->val + l2->val;//和
if (r + cnt >= 10)//和大于十的话
{
ans->val = (r + cnt) % 10;//取余数
r = (r + cnt) / 10;//整除
}
else
{
ans->val = r + cnt;
r = 0;//这里要小心,r被使用了之后就要置零
}
l1 = l1->next;
l2 = l2->next;//前进
}
if (r != 0)//防止最高位多出来一位
{
ans->next = new ListNode(0);//新开内存
ans = ans->next;
ans->val = r;
}
return l3->next;//注意最初的节点是没有用的,返回值类型要求为指针
}
int read(ListNode *l)//read函数,读取链表的长度
{
int len = 1;//注意这里从一开始
while (l->next != NULL)//链表的尽头的判断
{
l = l->next;//下一节
len++;//长度加一
}
return len;//返回长度
}
void put_zero(ListNode *l, int slen, int llen)//置零函数,用来使链表对齐
{
ListNode *p = l;//slen = smaller lenth较小长度,llen = long lenth较大长度
for (int i = 1; i < llen; i++)//注意什么时候开始什么时候结束
{
if (i < slen)
{
p = p->next;//这里走到最后的一个
}
else
{
p->next = new ListNode(0);//这里没有了,要新开
p = p->next;
p->val = 0;//这个可以不要
}
}
}
};
注意事项:
1、这里最多有一百位的数,即使是unsighned long long也没有办法存下来,所以只能逐位相加,类似于高精度加法。
2、注意,空指针的错误,一定要先分配内存再用,否则会很痛苦。