Если длина списков равна O(N)
, это решение равно O(N)
с O(1)
пробелом.
FUNCTION length(LIST list) : INT
// returns number of nodes until the end of the list
FUNCTION skip(LIST list, INT k) : LIST
// return the sublist of list, skipping k nodes
FUNCTION intersection(LIST list1, list2) : LIST
// returns the sublist where the two lists intersects
INT n1 = length(list1);
INT n2 = length(list2);
IF (n1 > n2) THEN
list1 = skip(list1, n1-n2)
ELSE
list2 = skip(list2, n2-n1)
WHILE (list1 != list2)
list1 = skip(list1, 1)
list2 = skip(list2, 1)
RETURN list1
По сути, пройдитесь по каждому списку, чтобы найти количество узлов. Затем пропустите достаточно элементов из более длинного списка, чтобы теперь у вас были списки одинаковой длины. Затем, синхронно, двигайтесь вперед шаг за шагом, пока не встретятся два списка.