1 题目
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
链接:https://leetcode-cn.com/problems/add-two-numbers
2 自己的解法
两个链表的加法,不能使用将链表内的数据转化为int再转化为链表,因为测试数据很大,即使是longlong也有可能超过范围。
选取l1链作为最终的结果链,按照l1的与l2的长度大小分成三类,进行十进制加法的模拟。这里面需要考虑的是三种情况不能冲突,也要考虑进位不断传递的情况。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* p = l1;
while(l1->next != NULL)
{
l1->val = l1->val + l2->val;
if(l1->val >= 10) {l1->next->val += 1;l1->val -= 10;}
l1 = l1->next;
l2 = l2->next;
if(l2 == NULL) break;
}
//l1到达最后一位 l2还没到
if(l2 != NULL && l2->next!=NULL)
{
l1->val = l1->val + l2->val;
if(l1->val >= 10) {l2->next->val += 1;l1->val -= 10;}
l1->next = l2->next;
l1 = l1->next;
}
if(l2 != NULL && l2->next==NULL)
l1->val = l1->val + l2->val;
//结束以后持续向高位进位
while(l1->val >= 10)
{
if(l1->next != NULL) {l1->next->val += 1;l1->val -= 10;l1 = l1->next;}
else
{l1->val -= 10;l1->next = new ListNode(1);break;}
}
return p;
}
};
运行时间为28ms,速度一般,但是占用多达72M的内存。
3 别人的解法
排名中比较靠前的几位,都是采用了一种类似于设计好一个节点然后寻找空间占领的策略,并且大量使用了三元运算符,看起来很美观。
4 改进的代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode answer(0),*p = &answer;
int carry = 0;
while(l1 || l2 || carry)
{
int tmp = 0;
if(l1 != NULL) tmp += l1->val;
if(l2 != NULL) tmp += l2->val;
tmp += carry;
carry = tmp / 10;
tmp = tmp % 10;
//开始构思下一个节点
// 占用现有节点 省空间 首选l1
ListNode *nextNode = l1 ? l1 : l2;
// 如果l1 l2 都是空的
if(nextNode == NULL) nextNode = new ListNode(tmp);
nextNode->val = tmp;
p->next = nextNode;
p = p->next;
l1 = l1 ? l1->next : NULL;
l2 = l2 ? l2->next : NULL;
}
return(&answer)->next;
}
};
运行时间比自己的解法还长,40ms。内存也同样占用了很多,可能是机器的原因。