leetcode之【两数相加】C

一两周之前刚接触结构体struct,这个 两数相加 的程序还是让我get到了很多。

题目

  • 给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
  • 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
  • 您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

编写过程中出现的一些错误

1.在使用malloc分配动态内存的时候,需要给他“一整套”。

struct ListNode {      
	int val;      
	struct ListNode *next;
};

struct ListNode *l3 = (struct ListNode*)malloc(sizeof(struct ListNode));
//l3->val = 0; l3->next = NULL;

如上代码,如果单单只有第一句使用malloc分配动态内存的语句,是不够的,执行起来会出现如下报错:

Line 70: Char 15: runtime error: member access within misaligned address 0xbebebebebebebebe for type ‘struct ListNode’, which requires 8 byte alignment (ListNode.c)
0xbebebebebebebebe: note: pointer points here
< memory cannot be printed >

但是我们在给了他"空房子"之后,把"家具"都填进去,如:

struct ListNode *l3 = (struct ListNode*)malloc(sizeof(struct ListNode));
l3->val = 0; l3->next = NULL;

问题就解决了。

2.情况多样化的考虑

  • 长度都为n无进位?
  • 长度都为n有进位最后长度为n?
  • 长度都为n最后长度为n+1?
  • 长度不相同的的两个数相加最后的位数?

在考虑最后一种情况的时候,我想到了类似1+9,却没有想到1+99,1+999之类,致使程序在执行到 99+1这个测试用例的时候输出了错误的测试用例。

3.其他不足的就是程序执行用时较长;但是相应的执行消耗内存却是超过了100%的其他C程序。
程序执行结果

主要部分代码

语言:C

一些参数的定义

struct ListNode *l3 = (struct ListNode*)malloc(sizeof(struct ListNode));
l3->val = 0; l3->next = NULL;
struct ListNode* h1 = l1, * h2 =l2, * h3 = l3; 
int flag = 0;

对相同位数的对应部分进行处理

while(h1 && h2){
	if(flag){
            h3->val = 1;
            flag = 0;
        }
        h3->val += (h1->val + h2->val);
        if(h3->val >= 10){
            h3->val =  h3->val % 10;
            flag = 1;
        }
        h1 = h1->next;
        h2 = h2->next;
        if((h1 || h2) && !h3->next){
            struct ListNode *tempNode = (struct ListNode*)malloc(sizeof(struct ListNode));
            tempNode->val = 0;
            tempNode->next = NULL;
            h3->next = tempNode;
            h3 = h3->next;
        }
}

考虑如果两个n为相加最后为n+1位的情况

if (!h1 && !h2 && flag){
     if(!h3->next){
     struct ListNode *tempNode = (struct ListNode*)malloc(sizeof(struct ListNode));
     tempNode->val = 1;
     tempNode->next = NULL;
     h3->next = tempNode;
     }
 }

考虑第一个或者第二个数长出来的部分

if(h1){
        while(h1){
            h3->val = flag + h1->val;
            flag = 0;
            if(h3->val >= 10){
                h3->val = h3->val % 10;
                flag = 1;
            }
            h1 = h1->next;
            if(!h3->next && h1){
                struct ListNode *tempNode = (struct ListNode*)malloc(sizeof(struct ListNode));
                tempNode->val = 0;
                tempNode->next = NULL;
                h3->next = tempNode;
            }
            if(h1) h3 = h3->next;
        }
        if(flag && !h3->next){
            if(!h3->next){
                struct ListNode *tempNode = (struct ListNode*)malloc(sizeof(struct ListNode));
                tempNode->val = 1;
                tempNode->next = NULL;
                h3->next = tempNode;
            }
        }
}

感想

这次写的代码有些乱七八糟,还要继续努力学习!

遇到了不同的测试用例,然后这边补一下,那边补一下。这是一个挺不好的习惯,以后要把情况都考虑清楚。
其次就是对结构体不是特别掌握,导致了执行时频繁的执行错误。

改进

在写到blog末尾的时候,我想,这道题的代码大可不必如此冗长。一个新思路跳出了脑海:

链1全部复制到链3上,然后把链2一个一个结点往链3上面加

如此一来,不论是进位或者是动态内存的分配都显得清晰明了。

发布了13 篇原创文章 · 获赞 2 · 访问量 280

猜你喜欢

转载自blog.csdn.net/AuthurWhywat/article/details/105010430
今日推荐