题目:
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers
解答:
第一次提交代码,炫耀一下,内存击败100%用户哦(第一题是两年前提交的)
第一种解题思路如下:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2)
{
int sum = 0;
int flag = 0;
int flag1 = 0;//用于判断l1是否为空
int flag2 = 0;//用于判断l2是否为空
int a,b; //储存结构val临时变量
struct ListNode* retL = (struct ListNode*)malloc(sizeof(struct ListNode));
struct ListNode* tmpL = retL;
while(NULL != l1 || NULL != l2 || flag != 0)// flag进位判断必须加上,例如[5] [5]会出错
{
//a = NULL == l1 ? (a = 0, flag1 = 1) : l1->val; //会导致计算出错,有兴趣的可以试一下
if(NULL == l1)//这地方本来想用三目运算符,不知怎么改,flag比较难赋值
{
a = 0;
flag1 = 1;
}
else
a = l1->val;
if(NULL == l2)
{
b = 0;
flag2 = 1;
}
else
b = l2->val;
sum = a + b + flag;
flag = sum > 9 ? 1 : 0;
sum = sum % 10;
l1 = flag1 ? NULL : l1->next;// l1 = l1->next == NULL ? NULL : l1->next; 会段错误
l2 = flag2 ? NULL : l2->next;
struct ListNode* L = (struct ListNode*)malloc(sizeof(struct ListNode));
if(NULL == L)
{
printf("malloc fail!\n");
exit(-1);
}
L->val = sum;
tmpL->next = L;
tmpL = L;
}
tmpL->next = NULL;
return retL->next;
}
下边还有另外一种失败的解题思路,有兴趣的可以看看。
自己的方案,发现有问题,修改到这种程度已经修改不下去了,sum改为long long型总有会溢出的时候,说明此路不通,只能换方法了。
/**
* Definition for singly-linked list.
struct ListNode {
int val;
struct ListNode *next;
};
*/
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2)
{
unsigned long long sum = 0;
int i = 1;
while(NULL != l1)
{
sum += l1->val * i;
i = i * 10;
l1 = l1->next;//注意下次循环,第一次提交死循环超时(没有加这条语句)
}
printf("sum:%d\n",sum);
i = 1;
while(NULL != l2)
{
sum += l2->val * i;
i = i * 10;
l2 = l2->next;
}
printf("sum:%d\n",sum);
struct ListNode* retL = (struct ListNode*)malloc(sizeof(struct ListNode));
if(NULL == retL)
{
printf("malloc fail!\n");
exit(-1);
}
struct ListNode* tmpL = retL;
//for( ;sum != 0; sum = sum / 10 )//不能使用for循环,[0], [0].用例通不过,考虑不周
do
{
struct ListNode* L = (struct ListNode*)malloc(sizeof(struct ListNode));
if(NULL == L)
{
printf("malloc fail!\n");
exit(-1);
}
L->val = sum % 10;
tmpL->next = L;
tmpL = L;
sum = sum / 10;
}while(sum != 0);
tmpL->next = NULL;//必须加上,不然会报错,指针未赋值,会造成野指针
return retL->next;
}