力扣第二题 两数相加 C语言版

  • 思考
    用链表实现两数相加,简单的是这道题的数字使倒序给我们的,所以直接从第一结点开始相加,若大于10则进位即可,我想的是只要到达的两个链表的结点都不为空,则相加取余存在新的结点中,加在新链表上,用sum储存取整留下的进位数,当有一个链表为空时,直接将新链表的最后指向剩下的一个链表

  • 错误
    忽略了当一个链表为空时的前一步,可能有进位,在网上看了各路大神的答案后加了sum!=0的情况

  • 自己的答案

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */


struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
    static struct ListNode* result;
    result = (struct ListNode*)malloc(sizeof(struct ListNode));
    result->next = NULL;
    struct ListNode* L;
    L = result;
    int sum=0;
	while(l1!=NULL || l2!=NULL || sum!=0){
		if(l1!=NULL){
            sum += l1->val;
            l1 = l1->next;
        }
        if(l2!=NULL){
            sum += l2->val;
            l2 = l2->next;
        }
		struct ListNode* p;
        p = (struct ListNode*)malloc(sizeof(struct ListNode));
        p->next = NULL;
        p->val = sum % 10;
        L->next = p;
        L = L->next;
        sum = sum / 10;
	}
	
    if(l1!=NULL){
        L->next = l1;
    }
    if(l2!=NULL){
        L->next = l2;
    }
    
    result = result->next;
	return result;
}
  • 感觉自己的答案有点冗长,(但是居然击败了89% 90%的人???)别人的答案:
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
    struct ListNode *new1,*p3;
    static struct ListNode *result;
    result=(struct ListNode *)malloc(sizeof(struct ListNode));
    result->next=NULL;//这里很重要,定义了指针以后,要把它的next赋成NULL,否则会编译出错
    int sum=0;
    p3=result;
   while(1)
   {
       if(l1)
       {
           sum+=l1->val;
           l1=l1->next;
       }
       if(l2)
       {
           sum+=l2->val;
           l2=l2->next;
       }
       p3->val=sum%10;
       sum=sum/10;
       if(l1 || l2 || sum!=0)//当l1不为空或l2不为空或sum不为0时,循环继续
       {
           new1=(struct ListNode *)malloc(sizeof(struct ListNode));
           new1->next=NULL;//这里很重要,定义了指针以后,要把它的next赋成NULL,否则会编译出错
           p3->next=new1;
           p3=p3->next;
       }
       else break;//否则跳出循环得到结果
   }
    return result;
}
--------------------- 
作者:Eunhyuk_Z 
来源:CSDN 
原文:https://blog.csdn.net/yyangyifan/article/details/87911606 
版权声明:本文为博主原创文章,转载请附上博文链接!

你可能感兴趣的:(力扣第二题 两数相加 C语言版)