Simplest quick sort using one 19-line function
Rather than creating new Lists, your method could sort the list in place. The method you call recursively could take the list and index values; the methods would look something like this:

/**
 * sorts the {@code list} in place
 */
public static void sort(ArrayList&lt;Integer&gt; list) {
    sort(list, 0, list.size());
}

/**
 * Sorts the {@code list} from {@code fromIndex} to {@code toIndex} - 1.
 */
private static void sort(List&lt;Integer&gt; list, int fromIndex, int toIndex) {

    if (fromIndex == toIndex - 1) {
        return;
    } else {
        // find the pivot, Collections.swap elements, etc...
        // recursively call self.
    }

}


Sorting the list in place reduces the amount of memory on the stack.

Also, to make the code more generic, perhaps you could sort lists of Comparable instead of Integer.