А в чём проблема? Если индексы уже построены (читай - списки отсортированы), то просто двигаясь параллельно по всем четырём спискам можно находить все пересечения списков за один проход.
Пусть у нас есть четыре отсортированных по возрастанию списка.
0. Добавим в конец каждого списка один и тот же элемент, заведомо больший любого элемента из любого списка.
1. Поставить указатели на первые элементы списков.
2. Найти минимальное значение из текущих элементов, обозначим его через Min.
3. Посчитать количество текущих элементов, равных Min. Если оно равно 4 - вывести элемент.
4. Для каждого списка, пока значение текущего элемента равно Min, передвинуть указатель на следующий элемент.
5. Если ни один указатель не дошёл до конца списка, то перейти к пункту 2.
Для поиска пересечений трёх из четырёх или двух из четырёх списков - подкорректировать пункты 3 и 5.