给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。
你可以假设除了数字 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) {
int c=0;
ListNode* h=l1;
ListNode* p;
while(l1->next!=NULL && l2->next!=NULL)
{
int s=l1->val+l2->val+c;
if(s>=10)
{
s=s-10;
c=1;
} else
{
c=0;
}
l1->val=s;
l1=l1->next;
l2=l2->next;
}
int s=l1->val+l2->val+c;
if(s>=10)
{
s=s-10;
c=1;
} else
{
c=0;
}
l1->val=s;
if(l1->next==NULL)
{
l1->next=l2->next;
}
p=l1;
l1=l1->next;
while(l1!=NULL)
{
int s=l1->val+c;
if(s>=10)
{
s=s-10;
c=1;
} else
{
c=0;
}
l1->val=s;
p=l1;
l1=l1->next;
}
if(c==1)
p->next=new ListNode(1);
return h;
}
};
感觉代码过于繁琐了,下面是简洁且高效的代码。
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode head(0) ,*p = &head;
int carry = 0;
while(l1 || l2 ||carry)
{
int sum = (l1 ? l1->val : 0) + (l2 ? l2->val : 0) +carry;
carry = sum / 10;
p->next = new ListNode(sum%10);
p = p->next;
l1 = l1 ? l1->next : l1;
l2 = l2 ? l2->next : l2;
}
return head.next;
}
思路很好,while(l1 || l2 ||carry)这一句很精髓,生成了一条新链表,使用了较多空间,不过节省了时间和代码量,很有借鉴意义。
};