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
相关产品推荐
相关产品推荐

