如何调试C语言实现LeetCode两数相加程序的输出错误?
问题分析与修复
核心错误1:整数溢出
你的测试用例中,l2对应的数值是1999999999,加上l1的9得到2000000008,但C语言中int的取值范围通常是-2147483648到2147483647,2000000008超出了这个范围,导致add变量溢出变成负数。后续代码中while (add > 0 && i > 0)的条件不成立,add == 0的判断也不触发,最终sum始终为NULL,返回空指针。
核心错误2:pow函数的精度问题
pow是浮点数运算函数,计算10的幂时可能存在精度误差。比如pow(10,9)可能返回999999999.9999999,强制转成int后会变成999999999,导致num2的计算结果错误,进一步加剧溢出问题。
修复方案:直接逐位相加(避免整数转换)
正确的思路是不把链表转成整数,而是直接遍历两个链表,逐位相加并处理进位,这样既不会有溢出问题,也能避免浮点数精度错误。修复后的代码如下:
/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */ struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) { struct ListNode dummy; // 哑节点简化链表操作 struct ListNode* current = &dummy; int carry = 0; while (l1 != NULL || l2 != NULL || carry != 0) { int sum = carry; if (l1 != NULL) { sum += l1->val; l1 = l1->next; } if (l2 != NULL) { sum += l2->val; l2 = l2->next; } carry = sum / 10; current->next = malloc(sizeof(struct ListNode)); current->next->val = sum % 10; current->next->next = NULL; current = current->next; } return dummy.next; }
修复说明
- 使用哑节点避免处理链表头节点的特殊情况,简化代码逻辑。
- 遍历过程中同时处理两个链表的节点,以及剩余的进位(比如最后一位相加后还有进位的情况)。
- 逐位计算和与进位,完全避免了整数溢出和浮点数精度问题。
内容的提问来源于stack exchange,提问作者Vasudev Srivastava
相关产品推荐
相关产品推荐

