scope intersectSortedIntArrays. // may return null when result is empty static int[] intersectSortedIntArrays(int[] a, int[] b, IntBuffer buf default null) { int i = 0, j = 0, la = lIntArray(a), lb = lIntArray(b); // swap if a is longer than b if (la > lb) { int[] temp = a; a = b; b = temp; int temp2 = la; la = lb; lb = temp2; } // special case zero elements if (la == 0) null; // special case one element if (la == 1) ret Arrays.binarySearch(b, a[0]) >= 0 ? a : null; if (buf == null) buf = new IntBuffer; else buf.reset(); recurse(a, b, buf, 0, la, 0, lb); ret buf.toArray(); } svoid #recurse(int[] a, int[] b, IntBuffer buf, int aFrom, int aTo, int bFrom, int bTo) { if (aFrom >= aTo || bFrom >= bTo) ret; // nothing to do // start in the middle of a, search this element in b int i = (aFrom+aTo)/2; int x = a[i]; int j = Arrays.binarySearch(b, bFrom, bTo, x); if (j >= 0) { // element found recurse(a, b, buf, aFrom, i, bFrom, j); buf.add(x); recurse(a, b, buf, i+1, aTo, j+1, bTo); } else { j = -j-1; recurse(a, b, buf, aFrom, i, bFrom, j); recurse(a, b, buf, i+1, aTo, j, bTo); } } end scope