给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
缺陷:int会溢出。其他方案:先比较长度,然后在较长的链表的for循环环境下,每一位的值相加,溢出的带入到下一个位的计算,将每一个计算值保存在切片中,最后for循环切片,重新构造链表
func addList(a *ListNode,b *ListNode) *ListNode {
root_note := &ListNode{}
a_arr := []int{}
b_arr := []int{}
temp_a := &ListNode{}
temp_a.Next = a
temp_b := &ListNode{}
temp_b.Next = b
for temp_a.Next != nil {
temp_a = temp_a.Next
a_arr = append(a_arr,temp_a.Val)
}
for temp_b.Next != nil {
temp_b = temp_b.Next
b_arr = append(b_arr,temp_b.Val)
}
// 将数组反转成数字
var str_a = ""
var str_b = ""
for i := len(a_arr)-1;i>=0;i--{
str_a = str_a + strconv.Itoa(a_arr[i])
}
for i := len(b_arr)-1;i>=0;i--{
str_b = str_b + strconv.Itoa(b_arr[i])
}
int_a,_ := strconv.Atoi(str_a)
int_b,_ := strconv.Atoi(str_b)
var sum =int_a + int_b
int_str := strconv.Itoa(sum)
byte_arr :=[]byte(int_str)
temp_note := &ListNode{}
for i:=len(byte_arr)-1;i>= 0;i-- {
if i < len(byte_arr)-1{
note := &ListNode{}
val,_ := strconv.Atoi(string(byte_arr[i]))
note.Val = val
temp_note.Next = note
temp_note = note
}else {
val,_ := strconv.Atoi(string(byte_arr[i]))
temp_note.Val = val
root_note = temp_note
}
}
fmt.Println(sum)
fmt.Printf("%v",a_arr)
fmt.Printf("%v",b_arr)
fmt.Printf("%v",root_note.Val)
fmt.Printf("%v",root_note.Next.Val)
fmt.Printf("%v",root_note.Next.Next.Val)
fmt.Printf("%v",root_note.Next.Next.Next.Val)
return root_note
}
测试
func main() {
a3 := &ListNode{}
a3.Val = 4
a2 := &ListNode{}
a2.Val = 3
a2.Next = a3
a1 := &ListNode{}
a1.Val = 2
a1.Next = a2
//
a := &ListNode{}
a.Val = 1
a.Next = a1
b3 := &ListNode{}
b3.Val = 4
b2 := &ListNode{}
b2.Val = 2
b2.Next = b3
b1 := &ListNode{}
b1.Val = 2
b1.Next = b2
b := &ListNode{}
b.Val = 1
b.Next = b1
addList(a,b)
}
8542
[1 2 3 4][1 2 2 4]2458
网友评论