Use two pointers, one for each list. For current intervals A[i] and B[j]:
Compute intersection: [max(A[i].start, B[j].start), min(A[i].end, B[j].end)].
If start <= end, add to result.
Move the pointer of the interval that ends earlier (it cannot intersect any more intervals in the other list). It works because both lists are sorted. Time: . Space: for intersections.