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

