Решение проблем со структурой данных может быть сложным для новичка. Смотришь на проблему и возникает вопрос: с чего начать? Недавно я решал задачу поиска пересечения двух связанных списков. Проанализировав проблему, я нашел решение, которое я объясню ниже.
Задача
Ваша задача — написать программу для поиска узла, в котором начинается пересечение двух односвязных списков. Вы не можете изменять исходный ввод (предположим, что в списке нет цикла).
Одно из возможных решений — просмотреть первый список и запомнить все узлы, которые вы посетили. Вы можете использовать структуру Set() для хранения узлов по мере их посещения. Затем просмотрите второй список и для каждого узла проверьте, есть ли он в наборе. Если проверка положительная, это начало пересечения списков.
//node function Node(value) { // this.value = value; // this.next = null; //} //Time complexity: linear //Memory complexity: linear const findIntersectionNode = function(headA, headB) { let currentHeadA = headA let currentHeadB = headB let mySet = new Set() while (currentHeadA !== null) { mySet.add(currentHeadA) currentHeadA = currentHeadA.next } while (currentHeadB !== null) { if (mySet.has(currentHeadB)) { return currentHeadB } currentHeadB = currentHeadB.next } return null }