class Solution {
public List<List<Integer>> pathSum(TreeNode root, int sum) {
List<List<Integer>> res = new ArrayList<>();
if(root == null) return res;
List<Integer> list = new ArrayList<>();
helper(res, list, root, sum);
return res;
}
public void helper(List<List<Integer>> res, List<Integer> list, TreeNode root, int sum){
list.add(root.val);
if(root.left == null && root.right == null){
if(root.val == sum)
res.add(new ArrayList<>(list));
}
if(root.left != null)
helper(res, list, root.left, sum-root.val);
if(root.right != null)
helper(res, list, root.right, sum-root.val);
list.remove(list.size()-1);
}
}
Run Code Online (Sandbox Code Playgroud)
我正在研究Leetcode 113. Path Sum II。这与问题本身无关。我想知道为什么我必须写res.add(new ArrayList<>(list));而不是res.add(list);直接写在第13行。
写入new ArrayList<>(list)会创建一个新列表,其中包含 中的所有元素list。这是必需的,因为在您调用的函数末尾list.remove(list.size()-1);,您正在修改list变量。
如果您list直接添加res,remove调用也会修改res。
另一个相关的例子:
class MyClass {
public int modify = 5;
}
class Test {
public static void myFunction() {
MyClass object = new MyClass();
System.out.println(object.modify); // prints 5.
ArrayList<MyClass> myList = new ArrayList<>();
myList.add(object);
object.modify = 800;
for(MyClass item : myList) {
System.out.println(item.modify); // prints 800.
}
}
}
Run Code Online (Sandbox Code Playgroud)