You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何调试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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 01:35:56