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