【Question quotidienne】 2. Ajouter deux nombres

Insérez la description de l'image ici

La signification de la question est qu'un nombre est stocké dans une liste chaînée, avec la tête de la liste chaînée dans le bit bas et la queue de la liste chaînée dans le bit haut. Ensuite, les deux nombres sont additionnés et la nouvelle liste chaînée est renvoyée.

Idée d'algorithme: parcourez les deux listes liées séparément, additionnez chaque chiffre du nombre et vous pouvez obtenir une nouvelle liste liée. L'idée est relativement simple, maintenant je vais me concentrer sur les détails

  • Le report peut se produire: le report est représenté par un nombre reporté, et le nombre à la position actuelle après l'addition est (n1 + n2 + report)% 10, et carry = (n1 + n2 + carry) // 10. Lorsqu'il est ajouté au bit le plus élevé, un report peut également se produire. À ce stade, la valeur du nouveau nœud est report
  • La longueur de la liste chaînée est incohérente: nous pouvons considérer la valeur de la partie du nœud où la liste chaînée la plus courte est plus courte que la liste chaînée la plus longue comme 0
  • La fonction du pointeur q dans le code est que lorsque p atteint la position la plus élevée, un pointeur suivant qui n'est pas vide sera créé. À ce stade, nous devons utiliser q pour enregistrer le nœud avant p et placer le pointeur suivant à la position la plus élevée. Est vide
# 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 complexité temporelle est: O (max (longueur de l1, longueur de l2))

Je suppose que tu aimes

Origine blog.csdn.net/SJTUKK/article/details/109155408
conseillé
Classement