Нахождение пересекающегося узла из двух пересекающихся связанных списков

Спасибо Prerak,

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

$servername = "localhost"

Теперь все работает нормально.

26
задан kennytm 7 February 2010 в 00:27
поделиться

4 ответа

Это занимает время O (M + N) и пространство O (1), где M и N - общая длина связанных списков. Может быть неэффективным, если общая часть очень длинная (т.е. M, N > > m, n)

  1. Пройдите два связанных списка, чтобы найти M и N.
  2. Вернитесь к головкам, а затем пройдите | M − N | узлы в более длинном списке.
  3. Теперь переходите на шаг блокировки и сравнивайте узлы, пока не найдете общие.

Правка: Подробнее здесь .

47
ответ дан 28 November 2019 в 06:26
поделиться

Если возможно, вы можете добавить поле 'color' или подобное ему для узлов. Перебирайте один из списков, раскрашивая узлы по мере продвижения. Затем переберите второй список. Как только вы достигнете уже окрашенного узла, вы найдете пересечение.

16
ответ дан Jakob Borg 20 November 2019 в 07:24
поделиться
1121] Может быть, на данном этапе это не имеет значения, но вот мой грязный рекурсивный подход. Это занимает O(M) время и O(M) пространство, где M >= N для list_M длины M и list_N длины N

  1. Рекурсивно повторять до конца обоих списки, а затем считать с конца для шага 2. Обратите внимание, что list_N достигнет null до list_M, для M > N
  2. Одинаковые длины M=N пересекаются, когда list_M != list_N && list_M.next == list_N.next
  3. Различные длины M>N пересекаются, когда list_N != null

Пример кода:

Node yListsHelper(Node n1, Node n2, Node result) {
    if (n1 == null && n2 == null)
        return null;
    yLists(n1 == null ? n1 : n1.next, n2 == null ? n2 : n2.next, result);
    if (n1 != null && n2 != null) {
        if (n2.next == null) { // n1 > n2
            result.next = n1;
        } else if (n1.next == null) { // n1 < n2
            result.next = n2;
        } else if (n1 != n2 && n1.next == n2.next) { // n1 = n2
            result.next = n1.next; // or n2.next
        }
    }
    return result.next;
}
0
ответ дан thetaspark 20 November 2019 в 07:24
поделиться

Это работает на Ubuntu 9,04:

user@host:~$ grep EINVAL /usr/include/asm-generic/errno*.h
/usr/include/asm-generic/errno-base.h:#define   EINVAL      22  /* Invalid argument */

Вы также можете попробовать скрипт Python:

import errno
from os import strerror
from sys import argv
print strerror(errno.__dict__[argv[1]]
-121--3119881-


#! /bin/bash -f

errorDir="/usr/include/asm-generic" strError="$1" numericVal=awk -v pat="$strError" '$0 ~ pat{print $3}' $errorDir/errno-base.h $errorDir/errno.h perror $numericVal

Внимание! Поскольку этот скрипт использует расположение ERROR MACROS, он может не быть портативным, хотя и работает в моей системе.

-121--3119883-

Выгрузить содержимое (или адрес) обоих списков в одну хэш-таблицу. первое столкновение - это ваш перекресток.

7
ответ дан 28 November 2019 в 06:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: