El significado de la pregunta es que un número se almacena en una lista vinculada, con el encabezado de la lista vinculada en el bit inferior y la cola de la lista vinculada en el bit superior. Luego, los dos números se suman y se devuelve la nueva lista vinculada.
Idea del algoritmo: recorra las dos listas vinculadas por separado, sume cada dígito del número y podrá obtener una nueva lista vinculada. La idea es relativamente simple, ahora me enfocaré en los detalles
- El acarreo puede ocurrir: el acarreo se representa mediante un acarreo de número, y el número en la posición actual después de la suma es (n1 + n2 + acarreo)% 10, y acarreo = (n1 + n2 + acarreo) // 10. Cuando se agrega al bit más alto, también puede ocurrir un acarreo. En este momento, el valor del nuevo nodo es acarreo
- La longitud de la lista vinculada es inconsistente: podemos considerar el valor del nodo de la lista vinculada más corta más corto que la lista vinculada más larga como 0
- La función del puntero q en el código es que cuando p alcanza la posición más alta, se creará un puntero siguiente que no esté vacío. En este momento, necesitamos usar q para registrar el nodo antes de p, y establecer el siguiente puntero en la posición más alta. Esta vacio
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
p = head = ListNode() # p用来指示当前的结点
carry = 0
while(l1 or l2):
n1 = l1.val if l1 else 0 #l1不为空那么数值就为l1.val如果为空就为0
n2 = l2.val if l2 else 0
p.val = (n1 + n2 + carry) % 10
p.next = ListNode()
q = p # 用来记录p结点之前的结点,因为下一行中p变成了p.next
p = p.next
carry = (n1 + n2 + carry) // 10
l1 = l1.next if l1 else l1
l2 = l2.next if l2 else l2
if(carry > 0): #最高位还有进位
p.val = carry
else:
q.next = None #没有进位的话,把最高位的next指针置为空
return head
La complejidad del tiempo es: O (max (longitud de l1, longitud de l2))