class Solution {
public List threeSum(int[] nums) {
List result = new ArrayList();
int n = nums.length;
if(n == 0) return result;
Arrays.sort(nums);
for(int p1 = 0 ; p1 < n-2 ; p1++){
if (p1 > 0 && nums[p1 - 1] == nums[p1]) continue; // if we do not want duplicates
int l = p1+1;
int r = n-1;
while(l < r){
int sum = nums[l] + nums[r] + nums[p1];
if(sum == 0){ // 0 is the target sum
List list = new ArrayList();
list.add(nums[p1]);
list.add(nums[l]);
list.add(nums[r]);
result.add(list);
while (l < r && nums[l] == nums[l+1]) l++;//skip same
while (l < r && nums[r] == nums[r-1]) r--;//skip same
}
if(sum < 0){
l++;
}else{//always consume one element even when sum == 0
r--;
}
}
}
return result;
}
}