Основной подход к порядковым алгоритмам, подобным слиянию, заключается в том, что вам никогда не нужно рассматривать более трех элементов одновременно - передние элементы из каждого входного списка плюс потенциально сохраненный результат.
В этом случае я бы использовал ...
loop forever
while in1.value < in2.value : transfer item from in1 to output
while in2.value < in1.value : transfer item from in2 to output
if in1.value == in2.value :
transfer item from in1 to output
discard item from in2
while in1.value == value just transferred : disard item from in1
while in2.value == value just transferred : disard item from in2
Теперь неприятно - этот цикл предполагает, что списки бесконечны. Как вы обрабатываете пустые списки? Это непросто, если только вы не можете зарезервировать значение стража , которое больше любого допустимого значения, которое может появиться в списке.
Если вы не можете зарезервировать дозорного, вы можете подделать эффект - напишите функцию сравнения, которая проверяет наличие следующего элемента в каждой очереди перед сравнением значений, и обрабатывает «очередь исчерпана» как подразумевающую значение дозорного.
Это дает ...
loop forever
while in1.value < in2.value : discard item from in1
while in2.value < in1.value : discard item from in2
if in1 exhausted, break out of loop
if in2 exhausted, break out of loop
if in1.value == in2.value :
transfer item from in1 to output
discard item from in2
while in1.value == value just transferred : discard item from in1
while in2.value == value just transferred : discard item from in2
OOPS
Это союз. Преобразование в пересечение оставлено читателю в качестве упражнения.
EDIT
ОК - теперь это пересечение. Просто отбрасывать менее чем предметы, а не добавлять их в вывод. Также исправлена опечатка.
Примечание. Моя интерпретация заключалась в том, что результат пересечения должен быть набором, что означает отсутствие дубликатов. Это допускает дубликаты на входах, но на выходе нет дубликатов.