Description:
You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.
You may assume the two numbers do not contain any leading zero, except the number 0 itself.
Example:
Input: (2 -> 4 -> 3) + (5 -> 6 -> 4) Output: 7 -> 0 -> 8 Explanation: 342 + 465 = 807.
题解:
常规的链表题,不过样列给出的列子有一些误导,两个链表长度不一定相同。可以采用直接的解法,对应位置相加并且考虑进位就好,算法思想类似于归并的操作
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
struct ListNode *L;
L=(struct ListNode*)malloc(sizeof(struct ListNode));
struct ListNode *r;
r=L;
int flag=0;//进位符
while(l1!=NULL&&l2!=NULL){
struct ListNode *s=(struct ListNode*)malloc(sizeof(struct ListNode));//分配空间
if(l1->val+l2->val+flag>=10){//如果产生进位
s->val=(l1->val+l2->val+flag)-10;
r->next=s;//尾插法接入链表
r=s;
flag=1;
l1=l1->next;//后移
l2=l2->next;
}
else{
s->val=(l1->val+l2->val+flag);//没有进位
r->next=s;//尾插法
r=s;
flag=0;
l1=l1->next;//后移
l2=l2->next;
}
}
while(l1!=NULL){//l1长度长于l2,时,单独处理l1
struct ListNode *s=(struct ListNode*)malloc(sizeof(struct ListNode));
if(l1->val+flag>=10){
s->val=(l1->val+flag)-10;
r->next=s;
r=s;
flag=1;
l1=l1->next;
}
else{
s->val=(l1->val+flag);
r->next=s;
r=s;
flag=0;
l1=l1->next;
}
}
while(l2!=NULL){//单独处理l2
struct ListNode *s=(struct ListNode*)malloc(sizeof(struct ListNode));
if(l2->val+flag>=10){
s->val=(l2->val+flag)-10;
r->next=s;
r=s;
flag=1;
l2=l2->next;
}
else{
s->val=(l2->val+flag);
r->next=s;
r=s;
flag=0;
l2=l2->next;
}
}
if(flag==1&&l1==NULL){//考虑特殊情况,如5+5=10
struct ListNode *s=(struct ListNode*)malloc(sizeof(struct ListNode));
s->val=1;
r->next=s;
r=s;
}
r->next=NULL;
L=L->next;
return L;
}