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

Java不使用类字段递归提取ListNode单链表val存入ArrayList的实现方法

实现方案

你可以用两种符合要求的递归实现,都不需要定义类字段:

方案1:重载递归方法(性能更优)

通过入口方法初始化集合,将集合作为参数传递给递归逻辑,所有递归操作都往同一个集合内插值,避免重复初始化集合:

// 对外暴露的入口方法,返回完整的节点值集合
public static List<Integer> getInListNode(ListNode head) {
    List<Integer> valueList = new ArrayList<>();
    recursiveFill(head, valueList);
    return valueList;
}

// 私有递归方法,负责遍历节点填充集合
private static void recursiveFill(ListNode current, List<Integer> valueList) {
    if (current == null) {
        return;
    }
    // 存入当前节点值
    valueList.add(current.val);
    // 递归处理下一个节点
    recursiveFill(current.next, valueList);
}

对应addTwoNumbers方法调整为:

public static void addTwoNumbers(ListNode l1, ListNode l2) {
    List<Integer> l1Values = getInListNode(l1);
    List<Integer> l2Values = getInListNode(l2);
    // 后续直接使用两个集合做业务逻辑即可
}

方案2:纯递归返回集合(代码更简洁)

不需要额外重载方法,每层递归返回当前节点到末尾所有节点值的集合,通过集合拼接完成值的收集:

public static List<Integer> getInListNode(ListNode current) {
    List<Integer> result = new ArrayList<>();
    if (current == null) {
        return result;
    }
    // 先添加当前节点值
    result.add(current.val);
    // 拼接下一层递归返回的后续所有节点值
    result.addAll(getInListNode(current.next));
    return result;
}

两种方案的区别:

  • 方案1全程只生成一个ArrayList实例,节点数量大时性能更高,属于尾递归实现
  • 方案2每层递归都会生成新的ArrayList实例,代码更简洁,适合节点数不多的场景

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 05:24:04