Нахождение точки пересечения двух связанных списков?

1

Большинство сайтов представляют это решение (см. Метод 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 здесь отсутствует.

  • 0
    Пример, который вы разместили, неверен. list2 не может заканчиваться на узле 5 , потому что 5 связан с 6 и так далее. Смотрите комментарий к моему ответу.
  • 0
    Более того, в вашем примере: узел 1 : 1 -> 3 в первом списке, а затем 1 -> 4 для второго списка. Вы понимаете, что такое связанный список, верно? узел 1 может иметь только один next узел.
Теги:
data-structures
linked-list

2 ответа

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, чтобы сравнить "адрес памяти элемента" (из вашего предложения), вы просто сравниваете ссылки, которые дадут вам равенство, только если они ссылаются ("указывают на") на один и тот же объект.

Надеюсь, это поможет.

  • 0
    смотри мое обновление. Мой вопрос: что если самый первый элемент - это точка слияния?
  • 0
    @ user3198603 Пример, который вы разместили в обновлении, недействителен. list2 не может "заканчиваться" на узле 5 , потому что 5 указывает на 6 и т. д., поэтому длина list2 такая же, как list1 и алгоритм будет работать, поскольку d = 0;
Показать ещё 2 комментария
0

Ну, это может быть так же просто, как проверка корневых узлов обоих списков для равенства, если узлы равны, то есть ваша точка слияния.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню