В этой статье блога мы углубимся в тему пересечения связанных списков в JavaScript. Мы рассмотрим различные методы и предоставим примеры кода для каждого подхода. Независимо от того, являетесь ли вы новичком или опытным разработчиком, это руководство предоставит вам множество методов решения этой распространенной проблемы программирования.
Метод 1: грубое сравнение
Самый простой способ найти пересечение двух связанных списков — сравнить каждый узел первого списка с каждым узлом второго списка. Временная сложность этого метода равна O(m x n), где m и n — длины двух списков соответственно.
function findIntersection(list1, list2) {
let intersection = null;
let current1 = list1.head;
while (current1 !== null) {
let current2 = list2.head;
while (current2 !== null) {
if (current1 === current2) {
intersection = current1;
break;
}
current2 = current2.next;
}
if (intersection !== null) {
break;
}
current1 = current1.next;
}
return intersection;
}
Метод 2: хеш-набор
Использование хеш-набора позволяет нам снизить временную сложность до O(m + n), где m и n — длины двух списков соответственно. Мы перебираем первый список и сохраняем каждый узел в наборе. Затем мы перебираем второй список и проверяем, существует ли в наборе какой-либо узел.
function findIntersection(list1, list2) {
let intersection = null;
const set = new Set();
let current = list1.head;
while (current !== null) {
set.add(current);
current = current.next;
}
current = list2.head;
while (current !== null) {
if (set.has(current)) {
intersection = current;
break;
}
current = current.next;
}
return intersection;
}
Метод 3: два указателя
Используя два указателя, мы можем найти точку пересечения двух связанных списков более эффективным способом. Мы поддерживаем два указателя, по одному на каждый список, и перебираем списки. Когда указатель достигает конца списка, мы сбрасываем его в начало другого списка. Таким образом, два указателя в конечном итоге встретятся в точке пересечения или оба достигнут конца (что указывает на отсутствие пересечения).
function findIntersection(list1, list2) {
let pointer1 = list1.head;
let pointer2 = list2.head;
while (pointer1 !== pointer2) {
pointer1 = pointer1 === null ? list2.head : pointer1.next;
pointer2 = pointer2 === null ? list1.head : pointer2.next;
}
return pointer1;
}
В этой статье мы рассмотрели три различных метода поиска пересечения двух связанных списков в JavaScript. Мы обсудили метод сравнения методом перебора, реализацию хэш-набора и более эффективный метод двухуказателей. Каждый метод имеет свои преимущества и недостатки, поэтому выберите тот, который лучше всего подходит для вашего конкретного случая использования. Поняв эти методы, вы будете хорошо подготовлены к решению проблем пересечения связанных списков в ваших проектах JavaScript.