600ms

public class Solution {
    public ArrayList<ArrayList<Integer>> threeSum(int[] num) {
        ArrayList<ArrayList<Integer>> listlist = new ArrayList<>();
        if (num == null || num.length < 3) {
            return listlist;
        }
        //要先排序
        Arrays.sort(num);
        for (int i = 0; i < num.length-2; i++) {
            int left = i + 1;
            int right = num.length-1;
            while (left < right) {
                if (num[i] + num[left] + num[right] > 0) {
                    right--;
                }else if (num[i] + num[left] + num[right] < 0) {
                    left++;
                }else {
                    ArrayList<Integer> list = new ArrayList<>();
                    list.add(num[i]);
                    list.add(num[left]);
                    list.add(num[right]);
                    listlist.add(list);
                    /**
                     * 去重
                     * 举例
                     * -6 1 1 1 2 5 5 5 ,执行完下面代码之后,left和right分别指向 2 的左右位置
                     *        l   r 
                     */
                    while (left + 1 < right && num[left+1] == num[left]) {
                        left++;
                    }
                    while (right - 1 > left && num[right-1] == num[right]) {
                        right--;
                    }
                    //接着找
                    left++;
                    right--;
                }
            }
            /**
             * 去重
             * 举例,
             * -10 -10 0 10 ,i一开始在第一个-10的位置,下面代码执行完之后i指向第二个 -10 的位置
             *      i
             */
            while (i < num.length - 2 && num[i+1] == num[i]) {
                i++;
            }
        }
        return listlist;
    }
}