147. Insertion Sort List
Дана голова односвязного списка. Отсортируйте список, используя сортировку вставками, и верните голову отсортированного списка.
C# решение
сопоставлено/оригиналpublic class Solution {
public ListNode InsertionSortList(ListNode head) {
ListNode dummy = new ListNode();
ListNode curr = head;
while (curr != null) {
ListNode prev = dummy;
while (prev.next != null && prev.next.val <= curr.val) {
prev = prev.next;
}
ListNode next = curr.next;
curr.next = prev.next;
prev.next = curr;
curr = next;
}
return dummy.next;
}
}
C++ решение
auto-draft, проверить перед отправкой#include <bits/stdc++.h>
using namespace std;
// Auto-generated C++ draft from the C# solution. Review containers, LINQ and helper types before submit.
class Solution {
public:
public ListNode InsertionSortList(ListNode head) {
ListNode dummy = new ListNode();
ListNode curr = head;
while (curr != null) {
ListNode prev = dummy;
while (prev.next != null && prev.next.val <= curr.val) {
prev = prev.next;
}
ListNode next = curr.next;
curr.next = prev.next;
prev.next = curr;
curr = next;
}
return dummy.next;
}
}
Java решение
сопоставлено/оригиналclass Solution {
public ListNode insertionSortList(ListNode head) {
ListNode dummy = new ListNode();
ListNode curr = head;
while (curr != null) {
ListNode prev = dummy;
while (prev.next != null && prev.next.val <= curr.val) {
prev = prev.next;
}
ListNode next = curr.next;
curr.next = prev.next;
prev.next = curr;
curr = next;
}
return dummy.next;
}
}
JavaScript решение
сопоставлено/оригиналvar insertionSortList = function (head) {
let dummy = new ListNode();
let curr = head;
while (curr !== null) {
let prev = dummy;
while (prev.next !== null && prev.next.val <= curr.val) {
prev = prev.next;
}
let next = curr.next;
curr.next = prev.next;
prev.next = curr;
curr = next;
}
return dummy.next;
};
Python решение
сопоставлено/оригиналclass Solution:
def insertionSortList(self, head: ListNode) -> ListNode:
dummy = ListNode()
curr = head
while curr:
prev = dummy
while prev.next and prev.next.val <= curr.val:
prev = prev.next
next = curr.next
curr.next = prev.next
prev.next = curr
curr = next
return dummy.next
Go решение
сопоставлено/оригиналfunc insertionSortList(head *ListNode) *ListNode {
dummy := &ListNode{}
curr := head
for curr != nil {
prev := dummy
for prev.Next != nil && prev.Next.Val <= curr.Val {
prev = prev.Next
}
next := curr.Next
curr.Next = prev.Next
prev.Next = curr
curr = next
}
return dummy.Next
}
Algorithm
1. Сортировка вставками итеративно работает, потребляя один входной элемент за каждую итерацию и формируя отсортированный выходной список.
2. На каждой итерации сортировка вставками удаляет один элемент из входных данных, находит место, куда он принадлежит в отсортированном списке, и вставляет его туда.
3. Процесс повторяется до тех пор, пока не закончатся входные элементы.
Пример:
Input: head = [4,2,1,3]
Output: [1,2,3,4]
👨💻
Алгоритм:
1️⃣
Создание вспомогательного узла (pseudo_head):
В качестве первого шага создайте вспомогательный узел, который называется pseudo_head. Этот узел будет использоваться как указатель на начало результирующего списка. Этот узел облегчает доступ к результирующему списку, особенно когда необходимо вставить новый элемент в начало списка. Этот прием значительно упрощает логику работы с односвязным списком.
2️⃣
Механизм вставки узла:
В односвязном списке каждый узел содержит только один указатель, который указывает на следующий узел. Чтобы вставить новый узел (например, B) перед определенным узлом (например, A), необходимо знать узел (например, C), который находится перед узлом A (т.е. C -> A). Имея ссылку на узел C, можно вставить новый узел так, чтобы получилось C -> B -> A.
3️⃣
Использование пары указателей для вставки:
Используя пару указателей (prev и next), которые служат местом для вставки нового элемента между ними, вставьте новый элемент в список. Это делается путем установки prev -> new_node -> next. Этот метод позволяет точно и безопасно вставлять новые элементы в список, сохраняя при этом правильный порядок элементов без необходимости перемещения других узлов списка.
😎
Вакансии для этой задачи
Показаны активные вакансии с пересечением по тегам задачи.