JSFiddle - React, Tailwind, and code Playground
JavaScript
function median(a, b) {
const target = Math.floor((a.length + b.length) / 2);
function findMatchingIndexFromA(n, start, finish) {
if (finish === 0) return 0;
if (start === a.length - 1) return a.length;
const middle = Math.floor((start + finish) / 2);
if (a[middle] > n) return findMatchingIndexFromA(n, start, middle);
if (a[middle + 1] < n) return findMatchingIndexFromA(n, middle, finish);
return middle;
}
function binary(start, finish, lastCall = [null, null]) {
const middle = Math.ceil((start + finish) / 2);
const match = findMatchingIndexFromA(b[middle], 0, a.length);
const index = middle + match + 1;
const isStuck = lastCall[0] === start && lastCall[1] === finish;
if (isStuck) return median(b, a);
if (index < target) return binary(middle, finish, [start, finish]);
if (index > target) return binary(start, middle, [start, finish]);
return b[middle];
}
return binary(0, b.length);
}
document.write(median([3,4,5,,10,11,12], [1,2,6,7,8,9,13,14]))