您的位置:首页 > 其它

2 Add Two Numbers

2015-09-18 16:22 239 查看
题意:给出两个链表的头结点,将两链表每个节点的数相加,构成新的节点。

分析:链表遍历。

代码:(写得比较繁琐,但比较好懂)

/**
* 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* head=new ListNode(0);
ListNode* p=head;
int c,s;
c=0;
while(1){
while(l1!=NULL&&l2!=NULL){          //l1和l2都不为空,l1->val+l2->val
s=l1->val+l2->val+c;
c=s/10;
s%=10;
p->next=new ListNode(s);
p=p->next;
l1=l1->next;
l2=l2->next;
}
if(l1==NULL&&l2!=NULL){          //l1为空,l2不为空,0+l2->val
s=l2->val+c;
c=s/10;
s%=10;
p->next=new ListNode(s);
p=p->next;
l2=l2->next;
}
if(l1!=NULL&&l2==NULL){          //l1不为空,l2为空,l1->val+0
s=l1->val+c;
c=s/10;
s%=10;
p->next=new ListNode(s);
p=p->next;
l1=l1->next;
}
if(l1==NULL&&l2==NULL){          //l1和l2都为空,处理进位
if(c>0){
p->next=new ListNode(c);
p=p->next;
}
break;
}
}
head=head->next;
return head;
}
};
另:简约代码

/**
* 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 dummy(-1);
int carry = 0;
ListNode *prev = &dummy;
for (ListNode *pa = l1, *pb = l2;pa != nullptr || pb != nullptr;
pa = pa == nullptr ? nullptr : pa->next,pb = pb == nullptr ? nullptr: pb->next,prev = prev->next) {
const int ai = pa == nullptr ? 0 : pa->val;
const int bi = pb == nullptr ? 0 : pb->val;
const int value = (ai + bi + carry) % 10;
carry = (ai + bi + carry) / 10;
prev->next = new ListNode(value);
}
if (carry > 0)
prev->next = new ListNode(carry);
return dummy.next;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: