思路
- 模擬加法:連結串列儲存的是逆序數位,因此從頭節點開始,逐位相加可以模擬正常的加法。每兩個節點的值相加,並記錄進位。
逐節點相加:
- 建立一個新的連結串列,用於儲存結果,每次將兩個連結串列對應節點的值加上進位值,結果儲存到新連結串列的節點中。
- 計算過程中,將
(l1.Val + l2.Val + carry)
相加的結果拆成兩個部分,一部分是當前位的值,另一部分是進位值(例如:(l1.Val + l2.Val + carry) / 10
)。
- 處理進位:若最終計算完連結串列後進位不為0,則在結果連結串列末尾增加一個新節點表示進位。
- 邊界條件:若連結串列長度不一,則將缺少的部分視為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
}