21. Merge Two Sorted Lists
C# решение
сопоставлено/оригинал/**
* Definition for singly-linked list.
* public class ListNode {
* public int val;
* public ListNode next;
* public ListNode(int val=0, ListNode next=null) {
* this.val = val;
* this.next = next;
* }
* }
*/
public class Solution {
public ListNode MergeTwoLists(ListNode list1, ListNode list2) {
ListNode dummyHead = new ListNode(-1);
// Create a dummy node as the starting point
ListNode current = dummyHead;
// Pointer to keep track of the current node
while (list1 != null && list2 != null) {
if (list1.val <= list2.val) {
current.next = list1;
list1 = list1.next;
} else {
current.next = list2;
list2 = list2.next;
}
current = current.next;
}
// Attach the remaining nodes if any
if (list1 != null) {
current.next = list1;
} else {
current.next = list2;
}
return dummyHead.next;
// Return the merged list starting from the node after the dummy head
}
}
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.
/**
* Definition for singly-linked list.
* public class ListNode {
* public int val;
* public ListNode next;
* public ListNode(int val=0, ListNode next=null) {
* this.val = val;
* this.next = next;
* }
* }
*/
class Solution {
public:
public ListNode MergeTwoLists(ListNode list1, ListNode list2) {
ListNode dummyHead = new ListNode(-1);
// Create a dummy node as the starting point
ListNode current = dummyHead;
// Pointer to keep track of the current node
while (list1 != null && list2 != null) {
if (list1.val <= list2.val) {
current.next = list1;
list1 = list1.next;
} else {
current.next = list2;
list2 = list2.next;
}
current = current.next;
}
// Attach the remaining nodes if any
if (list1 != null) {
current.next = list1;
} else {
current.next = list2;
}
return dummyHead.next;
// Return the merged list starting from the node after the dummy head
}
}
Java решение
сопоставлено/оригинал/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
if(list1!=null && list2!=null){
if(list1.val<list2.val){
list1.next=mergeTwoLists(list1.next,list2);
return list1;
}
else{
list2.next=mergeTwoLists(list1,list2.next);
return list2;
}
}
if(list1==null)
return list2;
return list1;
}
}
JavaScript решение
сопоставлено/оригинал/
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/
* @param {ListNode} list1
* @param {ListNode} list2
* @return {ListNode}
*/
var mergeTwoLists = function (list1, list2) {
if (!list1 !list2) {
return list1 list2;
}
if (list1.val <= list2.val) {
list1.next = mergeTwoLists(list1.next, list2);
return list1;
} else {
list2.next = mergeTwoLists(list1, list2.next);
return list2;
}
};
Python решение
сопоставлено/оригиналclass Solution(object):
def mergeTwoLists(self, l1, l2):
dummy = ListNode(0)
cur = dummy
while l1 and l2:
if l1.val <= l2.val:
cur.next = l1
l1 = l1.next
else:
cur.next = l2
l2 = l2.next
cur = cur.next
cur.next = l1 or l2
return dummy.next
Go решение
сопоставлено/оригинал/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func mergeTwoLists(list1 *ListNode, list2 *ListNode) *ListNode {
result := &ListNode{}
current := result
for list1 != nil && list2 != nil {
if list1.Val < list2.Val {
current.Next = list1
list1 = list1.Next
} else {
current.Next = list2
list2 = list2.Next
}
current = current.Next
}
if list1 == nil {
current.Next = list2
} else {
current.Next = list1
}
return result.Next
}
Создание фиктивного узла:
dummyHead — это фиктивный узел, который используется для упрощения операции слияния. Он помогает избежать необходимости в отдельных проверках на начало списка и управления указателем на голову нового списка.
Текущий узел:
current — указатель, который используется для построения нового связанного списка. Он начинается с фиктивного узла и будет перемещаться вперед по мере добавления узлов в результирующий список.
Цикл слияния:
Цикл продолжается до тех пор, пока не закончится один из списков (list1 или list2). Внутри цикла:
Сравниваются значения текущих узлов обоих списков.
Узел с меньшим значением добавляется к результирующему списку.
Указатель на текущий элемент добавляется в результат, а соответствующий указатель (list1 или list2) передвигается к следующему элементу.
Добавление оставшихся узлов:
После завершения цикла один из списков может содержать оставшиеся элементы. Цикл завершается, и все оставшиеся узлы второго списка добавляются к результату. Это делается просто путем присоединения оставшихся узлов одного списка к результирующему списку.
Возврат результата:
Возвращается новый связанный список, начиная с узла, следующего за фиктивным узлом (
dummyHead.next
). Фиктивный узел был добавлен только для упрощения процесса добавления элементов, и он не является частью фактического итогового списка.
Временная и пространственная сложность:
Временная сложность: O(n + m), где n и m — длины входных списков list1 и list2 соответственно. Всякий раз, когда элементы сравниваются и добавляются, это происходит один раз для каждого элемента из обоих списков.
Пространственная сложность: O(1). Дополнительная память используется только для временных переменных и фиктивного узла. Все элементы входных списков используются непосредственно в результирующем списке, и не требуется дополнительное выделение памяти для хранения их значений.
Вакансии для этой задачи
Показаны активные вакансии с пересечением по тегам задачи.