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);
}
}
我正在使用Leetcode 113. Path Sum II。这不是问题本身。我想知道为什么我必须写res.add(new ArrayList<>(list));
而不是直接写res.add(list);
在第13行。
3条答案
按热度按时间kfgdxczn1#
写入
new ArrayList<>(list)
将创建一个新列表,其中包含list
中的所有元素。这是必需的,因为在调用list.remove(list.size()-1);
的函数结束时,您将修改list
变量。如果直接在
res
中添加list
,则remove
调用也会修改res
。另一个相关的例子:
g2ieeal72#
new ArrayList<>(list)
将复制list
,这将确保元素存储到res
中。否则,在
list.remove(list.size()-1)
之后,res
中的元素将被删除。rggaifut3#
在Java中,当我们向集合中添加一个对象时,它会作为引用被添加到主集合中。但是如果我们在对象中进行更改,那么这些更改也会反映到主集合中。
在这种情况下,我们需要删除'list'的最后一个元素,以进行回溯,这也会导致删除'res' arraylist中的元素。所以我们必须创建一个“list”的深层副本作为“res.add(new ArrayList<>(list))”来维护更改。