刷leetcode题目时,有一道题目时这样的:
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers
以下是我提交的c语言代码:
void createNode(struct ListNode ** root,int value){
struct ListNode * item = (struct ListNode*)malloc(sizeof(struct ListNode));
if (item != NULL){
item->val = value;
item->next = NULL;
if (*root == NULL){
*root = item;
}
else{
struct ListNode *temp = *root;
while (temp->next){
temp = temp->next;
}
temp->next = item;
}
}
}
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
int value1, value2, sum, remainder, quotient = 0;
struct ListNode * newList = NULL;
if (l1 == NULL || l2 == NULL){
return NULL;
}
while (l1 || l2){
value1 = l1 == NULL ? 0: l1->val;
value2 = l2 == NULL ? 0: l2->val;
// remainder = (value1 + value2) % 10;
// createNode(&newList,remainder + quotient);
// quotient = (value1 + value2) / 10;
sum = quotient + value1 + value2;
quotient = sum / 10;
createNode(&newList,sum % 10);
l1 = l1 == NULL ? NULL : l1->next;
l2 = l2 == NULL ? NULL : l2->next;
}
if (quotient > 0){
createNode(&newList,quotient);
}
return newList;
}
重点来了,30-32行代码是我写的,然后调试用例死活有一些用例通不过,相加的值不是少个1就是多个1,然后我也没有发现代码到底哪里有问题,于是万般无奈之下,看了下标准题解,思想是一致的,然后引用了题解的33-35行替换了我原来的30-32行,提交,ok 用例通过。
然后我懵逼,才发现自己的问题是啥,这就是个简单的两数相加进位再两数相加的问题,正常人的思路应该都是sum = quotient + value1 + value2,quotient是上一次的进位。这也是小学生加法的水平。可是我咋就脑子一抽,先(value1+value2 ) % 10 + 1了?估计也没谁有我这奇葩了,内心万分难受,谨以此文记录下自己的奇葩写法。