兩數相加(Go,LeetCode)

目錄

題目描述

輸入/輸出示例

解決方案

代碼

代碼走讀

傳送門


 

題目描述

給出兩個非空的(單向)鏈表用來表示兩個非負的整數。其中,它們各自的位數是按照逆序的方式存儲的,並且它們每個節點只能存儲一位數字。

如果,我們將這兩個數相加起來,則會返回一個新的鏈表來表示他們的和。

您可以假設除數字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
}

 

傳送門

LeetCode試題鏈接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章