Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.59/302: Рейтинг темы: голосов - 302, средняя оценка - 4.59
1 / 1 / 0
Регистрация: 11.11.2018
Сообщений: 17

Объединение двух упорядоченных списков A и B в один упорядоченный список С

22.11.2018, 12:09. Показов 56899. Ответов 11

Студворк — интернет-сервис помощи студентам
Помогите, решить, пожалуйста!


Даны два целочисленных списка A и B, упорядоченных по неубыванию. Объедините их в один упорядоченный список С (то есть он должен содержать len(A)+len(B) элементов). Решение оформите в виде функции merge(A, B), возвращающей новый список. Алгоритм должен иметь сложность O(len(A)+len(B)). Модифицировать исходные списки запрещается. Использовать функцию sorted и метод sort запрещается.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.11.2018, 12:09
Ответы с готовыми решениями:

Слияние двух упорядоченных списков в один упорядоченный
Даны два списка упорядоченные по не убыванию.Объединить их в третий список упорядоченный по не убыванию. Не могу разобраться с процедурой...

Объединение двух упорядоченных по возрастанию массивов в один, также упорядоченный
Написать программу, которая объединяет два упорядоченных по возрастанию массива в один, также упорядоченный массив. Рекомендуемый вид...

Образовать из элементов двух упорядоченных списков новый список, тоже упорядоченный
Даны два упорядоченных списка. Образовать из элементов этих списков новый список, также упорядоченный

11
29 / 21 / 8
Регистрация: 23.10.2018
Сообщений: 51
Записей в блоге: 3
22.11.2018, 18:01
Предлагаю рассмотреть такой вариант (составляем новый список из min элементов, которые удаляем из списка А+В, если числа повторяются добавляем их столько раз, сколько надо):
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def merger(a, b):
    new_list = []
    d = a + b
    while d:
        delete_num = min(d)
        while delete_num in d:
            new_list.append(delete_num)
            d.remove(delete_num)
    return new_list
 
 
list_a = [3, 45, 50]
list_b = [44, 43, 44]
list_c = merger(list_a, list_b)
print(list_c)
вывод
[3, 43, 44, 44, 45, 50]
1
 Аватар для Semen-Semenich
5228 / 3474 / 1174
Регистрация: 21.03.2016
Сообщений: 8,301
22.11.2018, 18:31
с одним циклом
Python
1
2
3
4
5
6
def merger(a, b):
    new_list = []
    d = a + b
    while d:
        new_list.append(d.pop(d.index(min(d))))
    return new_list
1
1 / 1 / 0
Регистрация: 11.11.2018
Сообщений: 17
23.11.2018, 00:51  [ТС]
vlander, Ответ должен быть такой:
Test 1
input:
1 5 7
2 4 4 5
Wrong answer.
correct output:
1 2 4 4 5 5 7

Добавлено через 20 секунд
Semen-Semenich, Ответь такой должен быть

Test 1
input:
1 5 7
2 4 4 5
Wrong answer.
correct output:
1 2 4 4 5 5 7

Добавлено через 22 минуты
Semen-Semenich, и на 4 тесте показывает неправильный ответ Test 4
Wrong answer.

Добавлено через 8 минут
Semen-Semenich, vlander, Решил наконец задачу:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
lista = list(map(int, input().split()))
listb = list(map(int, input().split()))
 
 
def merge(a: list, b: list):
 
    lena = len(a)
    lenb = len(b)
 
    # если первый список длинее, то меняем
    # списки и переменные местами:
    if len(a) > lenb:
        a, b = b, a
        lena, lenb = lenb, lena
 
    i = 0   # индекс меньшего списка
    j = 0   # индекс большего списка
    listn = []   # новый список
 
    # цикл проходит только по меньшему списку:
    while i <= lena:
 
        # если конец одного из списка, то
        # добавляем оставшееся содержимое второго
        # списка в конец нового и выходим:
        if i == lena:
            listn = listn + b[j:lenb]
            return listn
        elif j == lenb:
            listn = listn + a[i:lena]
            return listn
 
        # проверяем числа списков и когда
        # берем число одного из списка в новый,
        # то увеличиваем соответствующий индекс:
        if a[i] < b[j]:
            listn.append(a[i])
            i += 1
        elif a[i] == b[j]:
            listn.append(a[i])
            listn.append(b[j])
            i += 1
            j += 1
        else:
            listn.append(b[j])
            j += 1
 
 
print(*merge(lista, listb))
1
29 / 21 / 8
Регистрация: 23.10.2018
Сообщений: 51
Записей в блоге: 3
23.11.2018, 07:51
А зачем такие сложности, ведь единый список проще сортировать, или у вас условия темы не позволяют это сделать?
0
 Аватар для Semen-Semenich
5228 / 3474 / 1174
Регистрация: 21.03.2016
Сообщений: 8,301
23.11.2018, 18:49
Лучший ответ Сообщение было отмечено makishmaki как решение

Решение

makishmaki, странно. ответ тот который должен быть
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
>>> def merger(a, b):
    new_list = []
    d = a + b
    while d:
        new_list.append(d.pop(d.index(min(d))))
    return new_list
 
>>> lista = list(map(int, input().split()))
1 5 7
>>> listb = list(map(int, input().split()))
2 4 4 5
>>> print(*merger(lista,listb))
1 2 4 4 5 5 7
>>>
1
1 / 1 / 0
Регистрация: 11.11.2018
Сообщений: 17
26.11.2018, 13:55  [ТС]
vlander, так коурсера требует)
0
1 / 1 / 0
Регистрация: 07.01.2019
Сообщений: 1
07.01.2019, 05:11
У меня на курсере так прошло:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
def merge(a, b):
    c = []
    i, j = 0, 0
    while i < len(a) and j < len(b):
        if a[i] <= b[j]:
            c.append(a[i])
            i += 1
        else:
            c.append(b[j])
            j += 1
    while i < len(a):
        c.append(a[i])
        i += 1
    while j < len(b):
        c.append(b[j])
        j += 1
    return c
 
 
lista = list(map(int, input().split()))
listb = list(map(int, input().split()))
 
 
print(*merge(lista, listb))
1
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38174 / 21109 / 4307
Регистрация: 12.02.2012
Сообщений: 34,711
Записей в блоге: 14
07.01.2019, 21:30
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
def merge(a,b):
    na=len(a)
    nb=len(b)
    r=[]
    ia=0
    ib=0
    while (True):
        if (ia == na):
            for j in range(ib+1,nb):
                r+=[b[j]]
            break
        if (ib == nb):
            for j in range(ia+1,na):
                r+=[a[j]]
            break
        if a[ia] > b[ib]:
            r+=[b[ib]]
            ib+=1
        else:
            r+=[a[ia]]
            ia+=1
    return r
    
a=[1,3,5,7,9,10,11,12]
b=[2,4,6,7,8,9,13,15]
r=merge(a,b)
print(r)
1
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
09.01.2019, 10:49
Это элемент сортировки слиянием. Можете воспользоваться готовым решением.
0
1 / 1 / 0
Регистрация: 14.05.2020
Сообщений: 13
03.10.2020, 20:10
Самое быстрое и точное решение среди этих программ
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
def merge(list1, list2):
    index1 = 0
    index2 = 0
    merged_list = []
    for _ in range(len(list1 + list2)):
        if index1 + 1 > len(list1):
            merged_list.append(list2[index2])
            index2 += 1
        elif index2 + 1 > len(list2):
            merged_list.append(list1[index1])
            index1 += 1
        elif list1[index1] < list2[index2]:
            merged_list.append(list1[index1])
            index1 += 1
        else:
            merged_list.append(list2[index2])
            index2 += 1
    return merged_list
 
 
numbers1 = [int(i) for i in input().split()]
numbers2 = [int(i) for i in input().split()]
print(*merge(numbers1, numbers2))
1
3750 / 1944 / 612
Регистрация: 21.11.2021
Сообщений: 3,706
08.10.2023, 05:25
Мое решение:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from random import randint
 
def merge(a,b):
    res = []
    pos_a = 0
    pos_b = 0
    while pos_a < len(a) or pos_b < len(b):
        while pos_a < len(a) and (pos_b >= len(b) or a[pos_a] <= b[pos_b]):
            res.append(a[pos_a])
            pos_a += 1
 
        while pos_b < len(b) and (pos_a >= len(a) or b[pos_b] <= a[pos_a]):
            res.append(b[pos_b])
            pos_b += 1
    return res
 
a = sorted([randint(1,10) for _ in range(randint(5,10))])
b = sorted([randint(1,10) for _ in range(randint(5,10))])
print(f'len(a) = {len(a)}, \t{a}')
print(f'len(b) = {len(b)}, \t{b}')
 
c = merge(a,b)
print(f'len(c) = {len(c)}, \t{c}')
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.10.2023, 05:25
Помогаю со студенческими работами здесь

сделать слияние 2 упорядоченных списков в один упорядоченный
пожалуйста поправьте где не так? Код: #include&lt;iostream&gt; using namespace std; struct Node{ Node*next; int info; }; Node...

Объединение 2 упорядоченных линейных списка произвольной структуры в один упорядоченный.
Помогите пожалуйста с таким заданием Объединить 2 упорядоченных линейных списка произвольной структуры в один упорядоченный.

слияние двух упорядоченных файлов в один упорядоченный
#include&lt;iostream&gt; #include&lt;fstream&gt; using namespace std; int main() { ifstream in(&quot;a.txt&quot;); ifstream in2(&quot;b.txt&quot;); ...

слияние двух упорядоченных массивов в один упорядоченный
это слияние двух упорядоченных массивов в один упорядоченный, программу я сама напишу, тока помогите немного врубиться Program...

Слияние двух упорядоченных массивов в один упорядоченный
Даны два упорядоченных по возрастанию массива целых чисел: А, со-стоящего из n элементов, и В, состоящего из m элементов. Выполните слияние...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru