動態

詳情 返回 返回

20241107,LeetCode 每日一題,使用 Go 計算兩數相加 - 動態 詳情

思路

  1. 模擬加法:鏈表存儲的是逆序數位,因此從頭節點開始,逐位相加可以模擬正常的加法。每兩個節點的值相加,並記錄進位。
  2. 逐節點相加

    • 創建一個新的鏈表,用於存儲結果,每次將兩個鏈表對應節點的值加上進位值,結果存儲到新鏈表的節點中。
    • 計算過程中,將(l1.Val + l2.Val + carry)相加的結果拆成兩個部分,一部分是當前位的值,另一部分是進位值(例如:(l1.Val + l2.Val + carry) / 10)。
  3. 處理進位:若最終計算完鏈表後進位不為0,則在結果鏈表末尾增加一個新節點表示進位。
  4. 邊界條件:若鏈表長度不一,則將缺少的部分視為0;同時確保最後若存在進位,將其單獨處理。

代碼


type ListNode struct {
    Val  int
    Next *ListNode
}

func addTwoNumbers(l1 *ListNode, l2 *ListNode) (head *ListNode) {
    var tail *ListNode
    carry := 0
    for l1 != nil || l2 != nil {
        var val1, val2 int
        if l1 != nil {
            val1 = l1.Val
            l1 = l1.Next
        }
        if l2 != nil {
            val2 = l2.Val
            l2 = l2.Next
        }
        sum := val1 + val2 + carry
        sum, carry = sum%10, sum/10
        if head == nil {
            head = &ListNode{sum, nil}
            tail = head
        } else {
            tail.Next = &ListNode{sum, nil}
            tail = tail.Next
        }
        if l1 == nil && l2 != nil {
            tail.Next = l2
            break
        }
        if l1 != nil && l2 == nil {
            tail.Next = l1
            break
        }
    }
    if carry > 0 {
        tail.Next = &ListNode{carry, nil}
    }
    return
}
user avatar y_luoe_hai_61a734cbf3c94 頭像 leguandeludeng 頭像 xialeistudio 頭像 liubo86 頭像 tecdat 頭像 secretflow 頭像 49u7s8yz 頭像 hzyopsfuture 頭像 chinesehuazhou 頭像 huamingshixunkeji 頭像 dongyf 頭像 aurora700 頭像
點贊 17 用戶, 點贊了這篇動態!
點贊

Add a new 評論

Some HTML is okay.