细节很多,用了相当长的时间。代码长度很长,不够简洁。
/**
* 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) {
if(l2==NULL) return l1;
if(l1==NULL) return l2;
ListNode *p=NULL,*q=NULL;
int m=0;//进位值
p=l1,q=l2;
int flag=0;//标记哪条链表更长
while(p!=NULL||q!=NULL){
if(p!=NULL&&q!=NULL){
int n=p->val+q->val;
p->val=(n+m)%10;
q->val=p->val;
if(n+m>=10) m=1;
else{
m=0;
}
p=p->next;
q=q->next;
}else if(p!=NULL&&q==NULL){
p->val+=m;
if(p->val==10){
p->val=0;
m=1;
} else{
m=0;
}
p=p->next;
}else if(p==NULL&&q!=NULL){
flag=1;
q->val+=m;
if(q->val==10){
q->val=0;
m=1;
} else{
m=0;
}
q=q->next;
}
}
if(m==1){
if(flag==0){
p=l1;
while(p->next!=NULL){
p=p->next;
}
ListNode *g=new ListNode(1);
p->next=g;
g->next=NULL;
return l1;
}else{
p=l2;
while(p->next!=NULL){
p=p->next;
}
ListNode *g=new ListNode(1);
p->next=g;
g->next=NULL;
return l2;
}
}
if(flag==0){
return l1;
}else {
return l2;
}
}
};