链表两数相加代码编译报错:Cannot assign field "val" because "<local9>.next" is null
问题分析与代码修复
核心错误解析
你遇到的Cannot assign field "val" because "<local9>.next" is null错误,本质是空指针访问:初始时temp指向dummy节点,而dummy的next为null,直接给temp.next.val赋值必然触发空指针。除此之外,代码还存在其他逻辑漏洞:
- 调用反转方法时传错参数:
reverse2(l1)应该传l2,否则两次反转的都是同一个链表 - 求和循环遗漏最后一个节点:
while(result1.next!=null)会跳过链表的最后一个节点值 - 未处理总和为0的情况:当输入都是0时,循环不执行,返回null不符合要求
错误点逐个修正
- 空指针问题:不能直接给
temp.next.val赋值,需要先创建新的ListNode节点,再赋值给temp.next - 参数传递错误:将
reverse2(l1)改为reverse2(l2) - 求和逻辑修正:把循环条件从
result1.next!=null改为result1!=null,确保遍历所有节点 - 特殊情况处理:单独判断总和为0的场景,直接返回值为0的节点
修正后的完整代码
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode next) { this.val = val; this.next = next; } * } */ class Solution { public ListNode addTwoNumbers(ListNode l1, ListNode l2) { ListNode result1 = reverse(l1); ListNode result2 = reverse(l2); int sum1 = 0; // 遍历所有节点,包含最后一个 while(result1 != null) { sum1 = (sum1 * 10) + result1.val; result1 = result1.next; } int sum2 = 0; while(result2 != null) { sum2 = (sum2 * 10) + result2.val; result2 = result2.next; } int totalsum = sum1 + sum2; // 处理总和为0的特殊情况 if(totalsum == 0) { return new ListNode(0); } ListNode dummy = new ListNode(0); ListNode temp = dummy; while(totalsum > 0) { int rem = totalsum % 10; // 创建新节点并挂载到链表上 temp.next = new ListNode(rem); temp = temp.next; totalsum = totalsum / 10; } return dummy.next; } // 合并重复的反转方法,减少冗余代码 ListNode reverse(ListNode head) { ListNode curr = head; ListNode prev = null; while(curr != null) { ListNode temp = curr.next; curr.next = prev; prev = curr; curr = temp; } return prev; } }
更优实现思路
题目中链表本身就是逆序存储数字,完全不需要反转链表,直接按位相加处理进位即可,还能避免大数溢出问题(如果链表过长,sum1和sum2可能超出int范围)。示例代码如下:
class Solution { public ListNode addTwoNumbers(ListNode l1, ListNode l2) { ListNode dummy = new ListNode(0); 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; temp.next = new ListNode(sum % 10); temp = temp.next; } return dummy.next; } }
内容的提问来源于stack exchange,提问作者Prashant Singh
相关产品推荐
相关产品推荐

