Вот как бы я решил эту проблему:
Шаг 1: Сделайте проход в обоих связанных списках, найдите длины
скажем len(L1) = m and len(L2) = n
Шаг 2: Найти разницу длин
if ( m > n )
d = m - n
else if ( n > m )
d = n - m
else
d = 0
Шаг 3: Переместить временный указатель d вперед по большему списку
Шаг 4: Теперь у нас есть два связанных списка для добавления, длина которых одинакова, поэтому добавьте их рекурсивно, сохраняя перенос.
Шаг 5: ( Примечание: , если (d == 0) не выполнять этот шаг)
После шага 4 у нас есть частичный список вывода, и теперь мы должны поместить оставшийся большой список вначало списка вывода.
if ( d > 0 )
-Travel larger list till d positions recursively
-Append sum = value_at_end + carry (update carry if sum >= 10) to output list at beginning
-Repeat until difference is consumed
Примечание: Я решаю проблему так, как она была поставлена передо мной, а не предлагая изменение базовой структуры данных.
Сложность времени:
- Выполнение отдельных проходов в обоих списках для определения их длины:
O(m+n)
- Суммирование двух связанных списков одинакового размера (м -d и n) рекурсивно:
O(n)
, предполагая m > n
- Добавление оставшегося большего списка к списку вывода:
O(d)
Итого: O( (m+n) + (n) + (d) )
ИЛИ O(m+n)
Сложность пространства:
- шаг 2 сложности времени:
O(n)
, пространство стека времени выполнения - шаг 3 сложности времени:
O(d)
, пространство стека времени выполнения
Всего: O(n + d)
ИЛИ O(n)