一、题目描述
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
二、题目分析
数字由链表表示,每个节点一位数字,所以只要从左到右把对应的节点上的数字相加即可,结果存储在新的节点上,或者为了节省空间在其中一个链表上操作也可以;
注意的点:
- 进位问题
- 数字链表长度问题
三、代码实现
// leetcode_2. 两数相加
// 欢迎继续优化代码
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
package main
import "fmt"
type ListNode struct {
Val int
Next *ListNode
}
func (ln *ListNode) PrintList() {
tmp_ln := ln
for tmp_ln.Next != nil {
fmt.Printf("%v -> ", tmp_ln.Val)
tmp_ln = tmp_ln.Next
}
fmt.Printf("%v\n", tmp_ln.Val)
}
func NewListNode(val int) *ListNode {
ln := new(ListNode)
ln.Next = nil
ln.Val = val
return ln
}
func AddNode(ln *ListNode, val int) {
tmp_ln := ln
for tmp_ln.Next != nil {
tmp_ln = tmp_ln.Next
}
tmp_ln.Next = NewListNode(val)
}
func ListLength(ln *ListNode) (l int) {
l = 0
tmp_ln := ln
for tmp_ln.Next != nil {
tmp_ln = tmp_ln.Next
l++
}
l++
return
}
func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
carry := 0
tl1 := l1
tl2 := l2
var ln *ListNode = nil
l1_length := ListLength(l1)
l2_length := ListLength(l2)
if l1_length < l2_length {
tl1, tl2 = tl2, tl1
}
for tl2 != nil {
tmp_val := tl2.Val + tl1.Val
if carry == 1 {
tmp_val += 1
carry = 0
}
if tmp_val > 9 {
carry = 1
tmp_val -= 10
}
if ln == nil {
ln = NewListNode(tmp_val)
} else {
AddNode(ln, tmp_val)
}
tl1 = tl1.Next
tl2 = tl2.Next
}
for tl1 != nil {
tmp_val := tl1.Val
if carry == 1 {
tmp_val += 1
carry = 0
}
if tmp_val > 9 {
carry = 1
tmp_val -= 10
}
AddNode(ln, tmp_val)
tl1 = tl1.Next
}
if carry == 1 {
AddNode(ln, carry)
}
return ln
}
func main() {
l1 := NewListNode(2)
AddNode(l1, 4)
AddNode(l1, 3)
AddNode(l1, 1)
AddNode(l1, 5)
l2 := NewListNode(5)
AddNode(l2, 6)
AddNode(l2, 4)
AddNode(l2, 4)
AddNode(l2, 5)
l1.PrintList()
l2.PrintList()
addTwoNumbers(l1, l2).PrintList()
}
运行结果:
2 -> 4 -> 3 -> 1 -> 5
5 -> 6 -> 4 -> 4 -> 5
7 -> 0 -> 8 -> 5 -> 0 -> 1
Process finished with exit code 0
——2019-07-17——