题目:
给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。
你可以假设除了数字 0 之外,这两个数字都不会以零开头。
【自己写的版本】:比较垃圾。。。所以后面看了官方的又写了改进版
/**
* 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* NewLink=new ListNode(0);
ListNode* NewLinkRear=NewLink;
int add=0;
while(l1!=NULL&&l2!=NULL){
if(NewLinkRear->next!=NULL)
{NewLinkRear=NewLinkRear->next;}
NewLinkRear->val=l1->val+l2->val+add;
ListNode* newnode=new ListNode(0);
NewLinkRear->next=newnode;
if(NewLinkRear->val>=10){
add=1;
NewLinkRear->val%=10;
}else{
add=0;
}
l1=l1->next;
l2=l2->next;
};
if(l1==NULL&&l2!=NULL){
NewLinkRear->next=l2;
while(add){
l2->val+=1;
l2->val>=10?add=1:add=0;
l2->val%=10;
if(l2->next!=NULL){
l2=l2->next;
}else{
if(add){
ListNode* AddNode=new ListNode(0);
AddNode->val=add;
l2->next=AddNode;
add=0;
}else{
l2->next=NULL;
}
}
}
}else if(l1!=NULL&&l2==NULL){
NewLinkRear->next=l1;
while(add){
l1->val+=1;
l1->val>=10?add=1:add=0;
l1->val%=10;
if(l1->next!=NULL){
l1=l1->next;
}else{
if(add){
ListNode* AddNode=new ListNode(0);
AddNode->val=add;
l1->next=AddNode;
add=0;
}else{
l1->next=NULL;
}
}
}
}else{
if(add){
ListNode* AddNode=new ListNode(0);
AddNode->val=add;
NewLinkRear->next=AddNode;
add=0;
}else{
NewLinkRear->next=NULL;
}
}
return NewLink;
};
};
【参考官方后写的改进版】:
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* NewLink=new ListNode(0);
ListNode* NewLinkRear=NewLink;
int add=0;
while(l1!=NULL||l2!=NULL){
int val1=l1==NULL?0:l1->val;
int val2=l2==NULL?0:l2->val;
if(NewLinkRear->next!=NULL)
{NewLinkRear=NewLinkRear->next;}
NewLinkRear->val=val1+val2+add;NewLinkRear->val>=10?add=1:add=0;
ListNode* newnode=new ListNode(0);
NewLinkRear->next=newnode;
NewLinkRear->val%=10;
if(l1!=NULL) l1=l1->next;
if(l2!=NULL) l2=l2->next;
};
if(add){
ListNode* newnode=new ListNode(1);
NewLinkRear->next=newnode;
}else{
NewLinkRear->next=NULL;
}
return NewLink;
};
};