//先进行排序,然后转换成数组,在三数之和的基础上再加上一层for循环就可以解这道题目。

public class Solution {

public ArrayList<ArrayList<Integer>> fournumber (ArrayList<Integer> nums, int target) {
    // write code here
    //
    ArrayList<Integer> collect = (ArrayList<Integer>)nums.stream().sorted().collect(Collectors.toList());
    int[] num = new int[collect.size()];
    for (int i = 0; i < collect.size(); i++) {
        num[i]=collect.get(i);
    }
    return threeSum(num,target);
}

public ArrayList<ArrayList<Integer>> threeSum(int[] num,int target) {
    ArrayList<ArrayList<Integer>> res=new ArrayList<>();
    if(num==null || num.length<4){
        return res;
    }
    for(int i=0;i<num.length;i++){
        if(i>0 && num[i]==num[i-1]){
            continue;// 去重
        }
        for(int j=i+1;j< num.length;j++){
            if(j>i+1 && num[j]==num[j-1]){
                continue;// 去重
            }
            int L=j+1;
            int R=num.length-1;

            while(L<R){
                int sum=num[i]+num[L]+num[R]+num[j];
                if(sum==target){
                    ArrayList<Integer> list=new ArrayList<>();
                    list.add(num[i]);
                    list.add(num[L]);
                    list.add(num[R]);
                    list.add(num[j]);
                    res.add(list);

                    while(L<R && num[L]==num[L+1]){
                        L++;
                    }
                    while(L<R && num[R]==num[R-1]){
                        R--;
                    }
                    //不等于的时候再加1
                    L++;
                    R--;
                }
                else if(sum>target){
                    R--;
                }
                else {
                    L++;
                }
            }
        }
    }
    return res;
}

}