/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
typedef struct ListNode ListNode;
typedef struct ListNode* LinkList;
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
LinkList p1=l1;
LinkList p2=l2;
int i=0;
int j=0;
int num1[100];
int num2[100];
//先提取数字装进数组里。
while(p1)
{
num1[i++]=p1->val;
p1=p1->next;
}
while(p2)
{
num2[j++]=p2->val;
p2=p2->next;
}
printf("l1长%d l2长%d",i,j);
int max=i>j?i:j;
int p,k;
p=0;
k=0;
int ModNum=0;//存储进位的数字
char save[max+1];
int count=0;
while(p<=i-1||k<=j-1)//利用循环来进行加法以及进位
{
if(k>j-1)//当第二个数已经没有可供相加的数字时。
{
save[count++]=(num1[p++]+ModNum)%10;//加法
ModNum=(num1[p-1]+ModNum)/10;//取余以便进位到一位。
printf("\n%d\n",save[count-1]);
continue;
}
if(p>i-1)//当一个数字已经没有可供相加的数字时。
{
save[count++]=(num2[k++]+ModNum)%10;
ModNum=(num2[k-1]+ModNum)/10;
printf("\n%d\n",save[count-1]);
continue;
}
// printf("\n%d %d\n",num1[p],num2[p]);
save[count++]=(num1[p++]+num2[k++]+ModNum)%10;
ModNum=(num1[p-1]+num2[k-1]+ModNum)/10;
printf("\n%d\n",save[count-1]);
}
LinkList answer;
if(ModNum!=0){
save[count++]=ModNum;//这里用来加那些例如5+5=10这种加之后的总和数字位数大于其中任一个数时。
}
answer=(LinkList)malloc(sizeof(ListNode));
answer->next=NULL;
answer->val=save[count-1];//按照题目规定的秩序,利用头插法将数字添加到链表里。
int o;
LinkList p3=NULL;
for(o=1;o<count;o++)
{
p3=(LinkList)malloc(sizeof(ListNode));
if(!p3) return 0;
p3->val=save[count-o-1];
p3->next=answer;
answer=p3;
}
return answer;
}
写这个题目的时候自己犯了不少简单的错误,在数学不够清晰。逻辑上一开始没有搞清楚各个位是怎么加的,就猛得写,结果就是一直会碰到通不过得测试例子。然后再不断得看测试例子过程中终于理解了。