题目大意:给出两个链表,每个链表表示一个逆序的数。将两个链表表示的数相加求和最后以链表的形式返回。
算法思想:
1.如果有一个链表为空,则返回相对的链表。
2.遍历链表。模拟加法进行运算,知道有一个链表为空结束。
3.将不空的链表继续和进位经行加法运算。
4.如果两个链表都遍历完还有进位则新申请一个节点存放进位,连接入表1.
代码如下:
/**
* 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(l1==NULL) return l2;
if(l2==NULL) return l1;
int Ad=0;
ListNode*p=l1,*q=l2,*pre=l1,*qre=l2;
while(p!=NULL&&q!=NULL){
int sum=p->val+Ad+q->val;
p->val=sum%10;
Ad=sum/10;
pre=p;
qre=q;
p=p->next;
q=q->next;
}
if(p!=NULL){
while(p!=NULL){
int sum=p->val+Ad;
p->val=sum%10;
Ad=sum/10;
if(!Ad) return l1;
pre=p;
p=p->next;
}
}
if(q!=NULL){
pre->next=q;
while(q!=NULL){
int sum=q->val+Ad;
q->val=sum%10;
Ad=sum/10;
if(!Ad) return l1;
pre=q;
q=q->next;
}
}
if(q==NULL&&p==NULL&&Ad!=0){
ListNode *s=new ListNode(Ad);
s->next=NULL;
pre->next=s;
}
return l1;
}
};