Соединение двух связанных списков: несколько методов, объясненных примерами кода

Связанные списки — это фундаментальная структура данных в информатике, часто используемая для хранения коллекций данных и управления ими. В некоторых сценариях возникает необходимость соединить два отдельных связанных списка, чтобы создать более крупный связанный список или выполнить определенные операции. В этой статье мы рассмотрим несколько методов соединения двух связанных списков с помощью их заголовков, приведя примеры кода для каждого подхода.

Метод 1: итерация – обход и добавление

Один простой метод соединения двух связанных списков — это перебор первого списка до достижения его конца, а затем добавление заголовка второго списка к последнему узлу первого списка. Вот пример реализации на Python:

def connect_lists(list1, list2):
    current = list1
    while current.next:
        current = current.next
    current.next = list2
    return list1

Метод 2: рекурсивный подход

Другой подход к соединению двух связанных списков — использование рекурсивной функции. Функция будет рекурсивно проходить первый список, пока не достигнет конца, а затем прикрепит заголовок второго списка к последнему узлу первого списка. Вот пример реализации на Java:

public ListNode connectLists(ListNode list1, ListNode list2) {
    if (list1 == null) {
        return list2;
    }
    list1.next = connectLists(list1.next, list2);
    return list1;
}

Метод 3: изменение последнего узла

В этом методе мы изменяем последний узел первого связанного списка, чтобы он указывал на заголовок второго связанного списка. Этот подход позволяет избежать перебора первого связанного списка, что приводит к более эффективному решению. Вот пример реализации на C++:

void connectLists(Node* list1, Node* list2) {
    Node* current = list1;
    while (current->next != nullptr) {
        current = current->next;
    }
    current->next = list2;
}

Метод 4. Использование фиктивного узла

Для соединения двух связанных списков можно использовать фиктивный узел. Этот подход предполагает создание нового фиктивного узла и обновление его следующего указателя на заголовок первого списка. Затем мы проходим по первому списку до его конца и соединяем последний узел с заголовком второго списка. Вот пример реализации на C#:

public ListNode ConnectLists(ListNode list1, ListNode list2) {
    ListNode dummy = new ListNode(0);
    dummy.next = list1;
    ListNode current = dummy;
    while (current.next != null) {
        current = current.next;
    }
    current.next = list2;
    return dummy.next;
}

В этой статье мы рассмотрели несколько способов соединения двух связанных списков с помощью их голов. Эти методы предоставляют различные подходы для достижения желаемого результата, позволяя программистам выбрать тот, который лучше всего соответствует их требованиям. Понимая эти методы и используя предоставленные примеры кода, разработчики могут эффективно соединять связанные списки и манипулировать их структурами по мере необходимости.