質問の意味は、リンクリストに番号が格納され、リンクリストの先頭が下位ビットに、リンクリストの末尾が上位ビットに格納されるということです。次に、2つの番号が加算され、新しいリンクリストが返されます。
アルゴリズムのアイデア:2つのリンクされたリストを別々にトラバースし、番号の各桁を合計すると、新しいリンクされたリストを取得できます。アイデアは比較的単純です、今私は詳細に焦点を当てます
- キャリーが発生する可能性があります。キャリーは番号キャリーで表され、加算後の現在の位置の番号は(n1 + n2 +キャリー)%10、キャリー=(n1 + n2 +キャリー)// 10です。最上位ビットに追加されると、キャリーも発生する可能性があります。このとき、新しいノードの値はキャリーです。
- リンクリストの長さに一貫性がありません。短いリンクリストが長いリンクリストよりも短いノードの部分の値を0と見なすことができます。
- コード内のポインタqの機能は、pが最高位置に達すると、空ではない次のポインタが作成されることです。このとき、qを使用してpの前のノードを記録し、次のポインタを最高位置に設定する必要があります。空です
# 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
時間の複雑さは次のとおりです。O(max(l1の長さ、l2の長さ))