leetCode 两数相加 C语言 自己的写法

/**
 * 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;oval=save[count-o-1];
   p3->next=answer;
   answer=p3;
}
return answer;
}

写这个题目的时候自己犯了不少简单的错误,在数学不够清晰。逻辑上一开始没有搞清楚各个位是怎么加的,就猛得写,结果就是一直会碰到通不过得测试例子。然后再不断得看测试例子过程中终于理解了。

你可能感兴趣的:(c)