【毎日の質問】2.2つの数字を足す

ここに写真の説明を挿入

質問の意味は、リンクリストに番号が格納され、リンクリストの先頭が下位ビットに、リンクリストの末尾が上位ビットに格納されるということです。次に、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の長さ))

おすすめ

転載: blog.csdn.net/SJTUKK/article/details/109155408