147. Insertion Sort List
leetcode medium
Task
Дана голова односвязного списка. Отсортируйте список, используя сортировку вставками, и верните голову отсортированного списка.
C# solution
matched/originalpublic 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++ solution
auto-draft, review before submit#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 solution
matched/originalclass 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 solution
matched/originalvar 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 solution
matched/originalclass 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.nextGo solution
matched/originalfunc 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
}Explanation
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. Этот метод позволяет точно и безопасно вставлять новые элементы в список, сохраняя при этом правильный порядок элементов без необходимости перемещения других узлов списка.
😎