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上面加
如此一来,不论是进位或者是动态内存的分配都显得清晰明了。