链表内存地址不对齐问题: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
相关产品推荐
相关产品推荐

