目錄
題目描述
給出兩個非空的(單向)鏈表用來表示兩個非負的整數。其中,它們各自的位數是按照逆序的方式存儲的,並且它們每個節點只能存儲一位數字。
如果,我們將這兩個數相加起來,則會返回一個新的鏈表來表示他們的和。
您可以假設除數字0以外,這兩個數都不會以0開頭。
輸入/輸出示例
指定兩個相加的整數 | 342, 465 |
得到的結果 | [ 8, 0, 7] |
解釋 |
因爲 2 + 5 = 7; 4 + 6 = 10, 進位後得0; 3 + 4 + 1(進位)= 8 |
解決方案
因爲兩個鏈表是單向鏈表,且是從個位數開始至最高位存儲的每一個數字,因此依次對兩個鏈表的每一位做加法即可。
在做加法的時候需要注意一點,如果兩個數相加超過了9,必須向更高位進位,即高位+1。如果高位+1後繼續大於9,重複進位,直至小於10。
需要考慮的一點是,兩個數長度不相等的情況。如果一個鏈表遍歷結束,則等待另一個鏈表全部遍歷完後計算纔可以結束。
代碼
package main
type ListNode struct {
Val int
Next *ListNode
}
func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
head := &ListNode{Val: 0}
pre := head
sum := 0
for {
if l1 == nil && l2 == nil && sum == 0 {
break
}
value1 := 0
value2 := 0
if l1 != nil {
value1 = l1.Val
}
if l2 != nil {
value2 = l2.Val
}
sum += value1 + value2
pre.Next = &ListNode{Val: sum % 10}
pre = pre.Next
sum = sum / 10
if l1 != nil {
l1 = l1.Next
}
if l2 != nil {
l2 = l2.Next
}
}
return head.Next
}
代碼走讀
package main // 鏈表節點 type ListNode struct { Val int Next *ListNode } func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode { // 定義一個新鏈表的表頭和指針。新鏈表用來保存最終的計算結果 head := &ListNode{Val: 0} pre := head // 每一步求和的暫存變量 sum := 0 for { if l1 == nil && l2 == nil && sum == 0 { break } value1 := 0 value2 := 0 if l1 != nil { value1 = l1.Val } if l2 != nil { value2 = l2.Val } // 每一步的求和結果 sum += value1 + value2 // 創建新的節點,將sum值的個位作爲新節點的值 pre.Next = &ListNode{Val: sum % 10} pre = pre.Next // 保留sum的十位數,作爲進位數保留到下一步計算中 sum = sum / 10 if l1 != nil { l1 = l1.Next } if l2 != nil { l2 = l2.Next } } return head.Next }