И тут мы резко начинаем не видеть леса за деревьями. При такой постановке люди начинают работать по принципу «как бы чего не вышло» вместо того, чтобы делать крутые вещи и получать от этого удовольствие.
Проблема в том, что с введением формальных критериев качества люди устремляются достигать не результата, а выполнения именно этих формальных критериев. Хорошо об этом написано вот тут
Ну уж искать расстояние между двумя точками в пределах одного города, исходя из сферичности земли — то ещё приближение. Искривление рельефа большую погрешность внесёт, да и вообще в пределах города (и в столь локальных, как 2км до метро) правильней использовать даже не евклидову, а манхэттенскую метрику.
Ну да, по сути мы разбиваем элементы исходных множеств A и B на три типа — «есть только в A» (ветка a[i] < b[j]), «есть только в B» (ветка a[i] > b[j]), «есть и в A, и в B» (ветка a[i] == b[j]). Все перечисленные функции есть комбинации этих трёх непересекающихся множеств, содержащих в себе все элементы исходных.
Симметрическую разность тоже можно за один проход посчитать, просто отслеживая минимальный элемент из имеющихся двух списков:
function symmetric_diff_sort_arr(array_1,array_2)
{
var n = array_1.length, m = array_2.length, i = 0, k = 0, j = 0, array_3 = [];
while ((i < n) && (j < m)) // пока не дошли до конца массива
{
if (array_1[i] < array_2[j]) {
array_3[k] = array_1[i];
k++;
i++; // сдвинем позицию в первом массиве
} else if (array_1[i] > array_2[j]) {
array_3[k] = array_2[j];
k++;
j++; // сдвинем позицию во втором массиве
} else {
i++, j++;
}
}
while (i < n) {
array_3[k] = array_1[i];
k++, i++;
}
while (j < m) {
array_3[k] = array_2[j];
k++, j++;
}
return array_3;
}
Кирк Лазарус одобряет это решение