Большинство сайтов представляют это решение (см. Метод 3 на http://www.geeksforgeeks.org/write-a-function-to-get-the-intersection-point-of-twolinked -lists/)
1) Получите подсчет узлов в первом списке, пусть count будет c1.
2) Получите подсчет узлов во втором списке, пусть count будет c2.
3) Получите разницу отсчетов d = abs (c1 - c2)
4) Теперь перейдите по более крупному списку с первого узла до d узлов, так что отсюда и в обоих списках одинаковое количество узлов.
5) Затем мы можем проходить оба списка параллельно, пока не встретим общий узел. (Обратите внимание, что получение общего узла выполняется путем сравнения адреса узлов)
Мое понимание выше решения не работает, если первый узел сам является слиянием узла. Say list1 имеет 5 элементов, а list2 имеет 3 элемента, где элемент1 является точкой слияния. Согласно вышеизложенному, количество разностей равно 2. поэтому сначала мы пройдем первые 2 узла в списке1. начиная с 3-х элементов списка, перемещайте элемент feom каждый список один за другим. Поэтому я никогда не получу точку слияния. Не так ли?
Мое предложение:
1) Перейдите через список1.
2) Поместите каждый адрес памяти элемента (с помощью System.identitityHashMap) в структуру данных на основе хеша
3) Перейдите через список2.Установите адрес памяти для каждого элемента и посмотрите, существует ли его в hashmap. Если да, то это точка слияния.
ОБНОВЛЕНИЕ: - Вход
list1 = 1 → 3 → 5 → 6 → 7
list2 = 1 → 4 → 5
В соответствии с решением, предложенным в разнице связей в размере, будет 2. Сначала перейдите до 3 в список1, затем сравните 5 → 6 → 7
с 1 → 4 → 5
. Таким образом, точка слияния 1 здесь отсутствует.
Мое понимание выше решения не будет работать, если первый узел сам является слиянием узла
Ваше понимание неверно, если подход будет работать. Учитывая ваш пример:
list1 = 1 → 2 → 3 → 4 → 5
list2 = 3 → 4 → 5
а узел 3
- это пересечение.
разность d = 5 - 3 = 2,
после того, как шаг 4) песни1 будет направлены на 2 и будет указывать на 3 → 4 → 5
, поэтому он будет указывать на точно такой же, как узел list2
, которые будут выявлены первым сравнением perfromed на этапе 5).
Поскольку вы реализуете это в Java, чтобы сравнить "адрес памяти элемента" (из вашего предложения), вы просто сравниваете ссылки, которые дадут вам равенство, только если они ссылаются ("указывают на") на один и тот же объект.
Надеюсь, это поможет.
list2
не может "заканчиваться" на узле 5
, потому что 5
указывает на 6
и т. д., поэтому длина list2
такая же, как list1
и алгоритм будет работать, поскольку d = 0;
Ну, это может быть так же просто, как проверка корневых узлов обоих списков для равенства, если узлы равны, то есть ваша точка слияния.
list2
не может заканчиваться на узле5
, потому что5
связан с6
и так далее. Смотрите комментарий к моему ответу.1
:1 -> 3
в первом списке, а затем1 -> 4
для второго списка. Вы понимаете, что такое связанный список, верно? узел1
может иметь только одинnext
узел.