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

链表内存地址不对齐问题:LeetCode第2题代码报错求助

修复LeetCode第2题(Add Two Numbers)的运行时错误

你的代码存在几个核心问题,直接导致了运行时错误和逻辑错误,以下是问题分析和修复方案:

问题分析

  • 非法内存访问:你仅为finalNode分配了一个节点的内存,但在第二个循环中,tmp会不断指向未初始化的tmp->next(野指针),访问tmp->val时触发非法内存访问;最后free(tmp)更是错误操作,此时tmp已经是野指针,指向的并非你分配的内存区域。
  • 数值溢出:用int存储链表代表的数值完全不可行,LeetCode测试用例中链表长度可能远超int的最大值范围(比如100位数字),直接转换会导致溢出,计算结果完全错误。
  • 浮点精度损失:pow(10, x)是浮点运算,存在精度误差(例如pow(10,3)可能返回999.9999999),乘以节点值后转成int会导致数值计算错误。

修复后的代码

/**
 * 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*)malloc(sizeof(struct ListNode));
    struct ListNode* curr = 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;
        }
        // 生成当前位节点
        curr->next = (struct ListNode*)malloc(sizeof(struct ListNode));
        curr = curr->next;
        curr->val = sum % 10;
        carry = sum / 10;
    }
    // 尾节点的next置空
    curr->next = NULL;
    
    // 释放哑节点,返回真正的结果头节点
    struct ListNode* result = dummy->next;
    free(dummy);
    return result;
}

代码逻辑说明

  • 用哑节点(dummy node)避免单独处理头节点的边界情况,简化代码结构。
  • 逐位模拟加法:每次循环计算当前位的总和(包含上一位的进位),当前位的值为sum % 10,新的进位为sum / 10。
  • 循环条件包含carry != 0,确保最后存在进位时(如999 + 1 = 1000),会额外生成一个节点存储进位值。
  • 最后释放哑节点,返回真正的结果链表头节点。

内容的提问来源于stack exchange,提问作者Rezno

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 20:27:56