Проблема 10:
Удалить дубликаты: напишите код для удаления дубликатов из несортированного связанного списка.
Input: 2->1->2->5->1->6->5 Output: 2->1->5->6
Подход 1:
Используя подход с двумя указателями. Имея два цикла while, мы берем каждый узел и сравниваем его данные с каждым другим узлом в связанном списке. Если данные равны, мы соответствующим образом меняем указатели узлов.
Временная сложность: O(N²)
Космическая сложность: O(1)
Таким образом, приведенный выше подход требует времени O (N²) для удаления дубликатов из несортированного связанного списка. Теперь нам нужно снизить временную сложность с O(N²) до O(N).
Если мы посмотрим на наше предыдущее решение, то увидим, что для каждого узла мы проверяем, присутствует ли узел в списке в другом месте или нет. Мы можем избежать этого, имея хеш-таблицу. Для каждого узла мы проверим, присутствуют ли его данные в хеш-таблице или нет. Если данные отсутствуют, то узел появляется впервые, если данные присутствуют, то узел уже существует в связанном списке и является повторяющимся узлом.
Временная сложность: O(N)
Сложность пространства: O (количество уникальных узлов в списке)
Итак, это два подхода к удалению дубликатов из связанного списка.
Вот и все!! Мы решили вопрос!