【Tägliche Frage】 2. Fügen Sie zwei Zahlen hinzu

Fügen Sie hier eine Bildbeschreibung ein

Die Frage hat die Bedeutung, dass eine Nummer in einer verknüpften Liste gespeichert wird, wobei sich der Kopf der verknüpften Liste im unteren Bit und das Ende der verknüpften Liste im oberen Bit befinden. Anschließend werden die beiden Nummern addiert und die neue verknüpfte Liste zurückgegeben.

Algorithmusidee: Durchlaufen Sie die beiden verknüpften Listen separat, addieren Sie jede Ziffer der Zahl und Sie erhalten eine neue verknüpfte Liste. Die Idee ist relativ einfach, jetzt werde ich mich auf die Details konzentrieren

  • Carry kann auftreten: Carry wird durch eine Zahl Carry dargestellt, und die Zahl an der aktuellen Position nach der Addition ist (n1 + n2 + Carry)% 10 und Carry = (n1 + n2 + Carry) // 10. Beim Hinzufügen zum höchsten Bit kann auch ein Übertrag auftreten. Zu diesem Zeitpunkt ist der Wert des neuen Knotens Übertrag
  • Die Länge der verknüpften Liste ist inkonsistent: Wir können den Wert des Teils des Knotens, in dem die kürzere verknüpfte Liste kürzer als die längere verknüpfte Liste ist, als 0 betrachten
  • Die Funktion des Zeigers q im Code besteht darin, dass, wenn p die höchste Position erreicht, ein nächster Zeiger erstellt wird, der nicht leer ist. Zu diesem Zeitpunkt müssen wir q verwenden, um den Knoten vor p aufzuzeichnen, und den nächsten Zeiger auf die höchste Position setzen. Ist leer
# 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
        

Die zeitliche Komplexität ist: O (max (Länge von l1, Länge von l2))

Ich denke du magst

Origin blog.csdn.net/SJTUKK/article/details/109155408
Empfohlen
Rangfolge