C++:
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
int carry=0;
ListNode *head=new ListNode;
while(l1!=NULL && l2!=NULL){
basic=(l1->val+l2->val+carry)%10;
carry=(l1->val+l2->val+carry)/10;
result->next=new ListNode(basic);
result=result->next;
l1=l1->next;
l2=l2->next;
}
while(l1!=NULL){
basic=(l1->val+carry)%10;
carry=(l1->val+carry)/10;
result->next=new ListNode(basic);
result=result->next;
l1=l1->next;
}
while(l2!=NULL){
basic=(l2->val+carry)%10;
carry=(l2->val+carry)/10;
result->next=new ListNode(basic);
result=result->next;
l1=l1->next;
}
return head->next;
}
};
第一遍写的,比较睿智。。改写一下:
class Solution {
public:
ListNode *addTwoNumbers(ListNode *l1, ListNode *l2) {
ListNode *res = new ListNode(-1);
ListNode *cur = res;
int carry = 0;
while (l1 || l2) {
int n1 = l1 ? l1->val : 0;
int n2 = l2 ? l2->val : 0;
int sum = n1 + n2 + carry;
carry = sum / 10;
cur->next = new ListNode(sum % 10);
cur = cur->next;
if (l1) l1 = l1->next;
if (l2) l2 = l2->next;
}
if (carry) cur->next = new ListNode(1);
return res->next;
}
};
网上的答案:
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode * ret=new ListNode(0);
ListNode * cur=ret;
bool carry=0;
int sum=0;
while(l1||l2||carry){
int sum=0;
if(l1){
sum+=l1->val;
l1=l1->next;
}
if(l2){
sum+=l2->val;
l2=l2->next;
}
if(carry) sum++;
carry=(sum>=10);
cur=(cur->next=new ListNode(sum%10));
}
return ret->next;
}
};
迭代,速度快了好多
class Solution {
public:
// Note - do not try to compute as a single integer first as the test cases
// try to catch you out if you do that. You have to accumulate the
// nodes in the result one by one.
ListNode *addTwoNumbers(ListNode *p1, ListNode *p2) {
return addTwoNumbers(p1, p2, 0);
}
static ListNode *addTwoNumbers(ListNode *p1, ListNode *p2, int carry) {
if (!p1 && !p2) {
if (0 != carry) {
return new ListNode(carry);
} else {
return nullptr;
}
}
int first = p1 ? p1->val : 0;
int second = p2 ? p2->val : 0;
int digit = (carry + first + second) % 10;
int nextCarry = (carry + first + second) / 10;
ListNode *pResult = new ListNode(digit);
pResult->next = addTwoNumbers(
p1 ? p1->next : nullptr,
p2 ? p2->next : nullptr,
nextCarry
);
return pResult;
}
};
Python:
class Solution:
def addTwoNumbers(self, l1, l2):
"""
:type l1: ListNode
:type l2: ListNode
:rtype: ListNode
"""
ret=ListNode(0)
cur=ret
carry=0
while(l1 or l2 or carry):
sum=0
if l1:
sum+=l1.val
l1=l1.next
if l2:
sum+=l2.val
l2=l2.next
sum+=carry
cur.next= ListNode(sum%10)
cur=cur.next
carry=(sum>=10)
return ret.next