给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
本来想利用新建一个链表存储,后来选择找到两个链表中最长的链表来进行存储。然而这种写法在时间复杂度和空间复杂度上并不佳。
提交代码:
/**
* 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* p1;
ListNode* p2;
ListNode* head;
p1 = l1;
p2 = l2;
if (!l1){
return l2;
}
if(!l2){
return l1;
}
int size1 = 0, size2 = 0;
while (p1 != NULL){
p1 = p1->next;
size1 ++;
}
while (p2 != NULL){
p2 = p2->next;
size2 ++;
}
p1 = size1 > size2 ? l1 : l2;
p2 = size1 > size2 ? l2 : l1;
head = p1;
int add = 0;
ListNode* tmp;
while (p1){
int temp = p2 ? p2->val+add : add;
add = (p1->val+temp) / 10;
p1->val = (p1->val+temp) % 10;
tmp = p1;
p1=p1->next;
if (p2){
p2 = p2->next;
}
}
if (add){
ListNode* end = new ListNode(add);
tmp->next = end;
}
return head;
}
};
学习了网上大神,这题也可以用递归算法:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
int add = 0;
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
if (!l1 && !l2 && !add ){
return NULL;
}
l1 = l1 ? (add+=l1->val,l1->next) : l1;
l2 = l2 ? (add+=l2->val,l2->next) : l2;
ListNode* result = new ListNode(add % 10);
add /= 10;
result->next = addTwoNumbers(l1,l2);
return result;
}
};
然而递归算法的时间复杂度和空间复杂度依旧不低...