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

LeetCode两数相加:返回链表触发未对齐地址访问运行时错误

LeetCode两数相加链表题错误分析与修复

错误原因拆解

1. 整数溢出与逻辑误解

题目中链表是逆序存储数字(如2->4->3代表342),你直接将链表转为整数相加的思路存在致命问题:

  • 当链表长度超过int的存储范围(比如超过10位),valueL1/valueL2会直接溢出,导致数值完全错误。
  • 10^loopNo是位异或运算,不是幂运算!正确的10的幂应该用循环累乘(比如用mul变量初始为1,每次循环乘10),或者用pow(10, loopNo)(注意强制转int)。

2. 链表构建的野指针问题

  • 当valueTotal为0时(比如两个输入链表都是0),findOOM返回0,循环for (int i = 0; i < order; i++)完全不执行,result节点的val未赋值,next是随机垃圾值,后续访问时触发对齐错误。
  • 循环内的判断条件if (i != order)错误,应该是if (i != order - 1),否则最后一次循环会多创建一个空节点,且最后一个节点的next未设置为NULL,导致访问无效内存(0xbebebebebebebebe是内存填充的无效指针标记)。

3. 未初始化链表节点的next指针

所有通过malloc创建的ListNode,其next指针必须显式设为NULL,否则会指向随机地址,引发运行时错误。

修正后的代码(正确的逐位相加逻辑)

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */

struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
    // 哑节点,简化链表头处理
    struct ListNode dummy;
    dummy.next = NULL;
    struct ListNode* temp = &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;
        struct ListNode* newNode = malloc(sizeof(struct ListNode));
        newNode->val = sum % 10;
        newNode->next = NULL; // 显式初始化next
        temp->next = newNode;
        temp = temp->next;
    }

    return dummy.next;
}

修正说明

  • 采用逐位相加+进位的思路,完全避免整数溢出问题,符合题目设计意图。
  • 使用哑节点(dummy)简化链表头的创建逻辑,无需单独处理第一个节点的特殊情况。
  • 所有新创建的节点都显式设置next = NULL,彻底杜绝野指针问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 06:12:40