【Pregunta diaria】 2. Suma dos números

Inserte la descripción de la imagen aquí

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))

Supongo que te gusta

Origin blog.csdn.net/SJTUKK/article/details/109155408
Recomendado
Clasificación