Ссылка на сайт:-
Описание :-
Дан односвязный список из N узлов. Задача состоит в том, чтобы найти середину связанного списка.
Например, если задан связанный список 10->20->30->40->50, то на выходе должно быть 30.
Если есть четные узлы, то средних узлов будет два, нам нужно вывести второй средний элемент. Например, если задан связанный список 1->2->3->4->5->6, то на выходе должно быть 4.
Пример 1:
Input: LinkedList: 1->2->3->4->5 Output: 3
Пример 2:
Input: LinkedList: 2->4->6->7->5->1 Output: 7
Ожидаемая временная сложность:O(N).
Ожидаемое вспомогательное пространство:O(1).
Ограничения:
1 ‹= N ‹= 5000
Способ 1 –
Шаг 1: Пройдите по связанному списку от начала до конечного узла. Подсчитайте количество узлов при обходе связанного списка.
Шаг 2. Подсчет количества узлов в связанном списке, разделенный на 2, даст среднее значение.
Шаг 3: Снова пройдите по связанному списку от головного узла до среднего значения. Наконец, верните данные в средний узел.
Ниже приведено решение java для этой проблемы:
class Solution { public ListNode middleNode(ListNode head) { // get the length of the linked list int len = 0; ListNode current = head; while (current != null) { len++; current = current.next; } current = head; int mid = len / 2; for (int i = 0; i < mid; i++) { current = current.next; } return current; } }
Способ 2: -
Шаг 1: создайте два указателя — быстрый и медленный. Оба этих указателя будут указывать на начало заголовка в начале.
Шаг 2 : Затем увеличьте быстрый указатель на 2 узла и медленный указатель на один узел.
Шаг 3: Когда быстрый указатель достигнет конца списка, медленный указатель дойдет до середины списка, и мы получим наш результат.
Ниже приведено решение java для этой проблемы:
class Solution { public ListNode middleNode(ListNode head) { if(head == null){ return head; } ListNode slow = head; ListNode fast = head; while(fast != null && fast.next != null){ slow = slow.next; fast = fast.next.next; } return slow; } }