LeetCode刷题之addTwoNumbers两链表之和Go语言版
题目描述
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
前提约束
- 每个链表中的节点数在范围[1, 100]内
- 0 <= Node.val <= 9
- 题目数据保证列表表示的数字不含前导零
示例
示例1
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.
示例2
输入:l1 = [0], l2 = [0]
输出:[0]
示例3
输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]
解决方案
package addTwoNumbers
import (
"strconv"
)
type ListNode struct {
Val int
Next *ListNode
}
// 定义个String方法,方便打印调试
func (l *ListNode) String() string{
if l.Next != nil{
return strconv.Itoa(l.Val) +", "+ l.Next.String()
}
return strconv.Itoa(l.Val)
}
func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
var head,tmp *ListNode
c := 0
for l1 != nil || l2 != nil{
a := 0
b := 0
if l1 !=nil{
a = l1.Val
l1 = l1.Next
}
if l2 !=nil{
b = l2.Val
l2 = l2.Next
}
if head == nil {
head = &ListNode{Val: (a+b+c)%10}
tmp = head
} else {
tmp.Next = &ListNode{Val: (a+b+c)%10}
tmp = tmp.Next
}
// 计算是否存在进位
c = (a + b + c) / 10
}
if c>0{
tmp.Next = &ListNode{Val: c, Next: nil}
}
return head
}
单元测试
package addTwoNumbers
import (
"reflect"
"testing"
)
func TestAddTwoNumbers(t *testing.T) {
tests := []struct {
name string
l1 *ListNode
l2 *ListNode
r *ListNode
wantErr bool
}{
{
"2-4-3*5-6-4",
&ListNode{2, &ListNode{4, &ListNode{3, nil}}},
&ListNode{5, &ListNode{6, &ListNode{4, nil}}},
&ListNode{7, &ListNode{0, &ListNode{8, nil}}},
false,
},
{
"0*0",
&ListNode{0, nil},
&ListNode{0, nil},
&ListNode{0, nil},
false,
},
{
"9-9-9-9-9-9-9*9-9-9-9",
&ListNode{9,
&ListNode{9,
&ListNode{9,
&ListNode{9,
&ListNode{9,
&ListNode{9,
&ListNode{9,
nil}}}}}}},
&ListNode{9, &ListNode{9, &ListNode{9, &ListNode{9, nil}}}},
&ListNode{8,
&ListNode{9,
&ListNode{9,
&ListNode{9,
&ListNode{0,
&ListNode{0,
&ListNode{0,
&ListNode{1,
nil}}}}}}}},
false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
l := addTwoNumbers(tt.l1, tt.l2)
if !reflect.DeepEqual(l, tt.r) && !tt.wantErr {
t.Errorf("结果值不符合预期,want:[%s], got:[%s]", tt.r, l)
}
})
}
}
题目来源
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。