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

链表两数相加代码编译报错: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不符合要求

错误点逐个修正

  1. 空指针问题:不能直接给temp.next.val赋值,需要先创建新的ListNode节点,再赋值给temp.next
  2. 参数传递错误:将reverse2(l1)改为reverse2(l2)
  3. 求和逻辑修正:把循环条件从result1.next!=null改为result1!=null,确保遍历所有节点
  4. 特殊情况处理:单独判断总和为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 23:11:12