排序 -> 双指针。

``` java
public class Solution {
public ArrayList<ArrayList<integer>> threeSum(int[] nums) {
if (nums == null || nums.length == 0) return new ArrayList<>();</integer>

    Arrays.sort(nums);

    ArrayList<ArrayList<Integer>> ans = new ArrayList<>();
    int n = nums.length;

    for (int i = 0; i < n; i++) {
        if (nums[i] > 0) break;
        if (i > 0 && nums[i] == nums[i - 1]) continue; // 排重

        int l = i + 1;
        int r = n - 1;
        while (l < r) {
            int num1 = nums[i];
            int num2 = nums[l];
            int num3 = nums[r];

            int cul = num1 + num2 + num3;

            if (cul == 0) {
                ans.add(new ArrayList<>(Arrays.asList(num1,num2,num3)));

                while (l < r && nums[l] == nums[l + 1]) l++; // 排重
                while (l < r && nums[r] == nums[r - 1]) r--; // 排重
                l++;
                r--;
            } else if (cul > 0) {
                r--;
            } else {
                l++;
            }
        }
    }
    return ans;
}

}
``` java