Optimal: two pointers
Time O(n + m) Space O(n + m) for the outputlo = max(starts), hi = min(ends); if lo ≤ hi record [lo, hi]. Advance the pointer whose interval ends first.
import java.util.*;
class Solution {
public int[][] intervalIntersection(int[][] A, int[][] B) {
List<int[]> out = new ArrayList<>();
int i = 0, j = 0;
while (i < A.length && j < B.length) {
int lo = Math.max(A[i][0], B[j][0]);
int hi = Math.min(A[i][1], B[j][1]);
if (lo <= hi) out.add(new int[]{lo, hi});
if (A[i][1] < B[j][1]) i++;
else j++;
}
return out.toArray(new int[0][]);
}
}Verdict: Linear.