题目
LeetCode题目链接:两数相加 给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位数字。 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。 您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
思路 1
两个链表不等长,那么在任一链表Next为nil时立刻跳出循环,再把长的链表加上去,最后把进位加上去,通俗,但是逻辑显得冗长拖沓。
func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
ret := &ListNode{}
curpos := ret //循环指针
overflow := 0 //进位
sum := 0 //每次相加之和
var tailpos *ListNode //未结束的链表指针
for {
sum = l1.Val + l2.Val + overflow
overflow = 0
if sum > 9 {
overflow = 1
sum = sum % 10
}
curpos.Val = sum
l1 = l1.Next
l2 = l2.Next
//任一链表结束立刻跳出循环
if l1 == nil {
tailpos = l2
break
}
if l2 == nil {
tailpos = l1
break
}
curpos.Next = &ListNode{}
curpos = curpos.Next
}
if tailpos != nil {
curpos.Next = &ListNode{}
curpos = curpos.Next
for {
sum = tailpos.Val + overflow
overflow = 0
if sum > 9 {
overflow = 1
sum = sum % 10
}
curpos.Val = sum
tailpos = tailpos.Next
if tailpos == nil {
break
}
curpos.Next = &ListNode{}
curpos = curpos.Next
}
}
if overflow != 0 {
curpos.Next = &ListNode{Val: overflow, Next: nil}
}
return ret
}
思路 2
在之前的基础上稍微改进下,当遇到有结束的链表时,新建0值节点补齐,直到两个链表NEXT节点均为nil时再跳出循环,最后再补上进位。
func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
ret := &ListNode{}
curpos := ret
overflow := 0
sum := 0
for {
sum = l1.Val + l2.Val + overflow
overflow = 0
if sum > 9 {
overflow = 1
sum = sum % 10
}
curpos.Val = sum
l1 = l1.Next
l2 = l2.Next
if l1 == nil && l2 == nil {
if overflow != 0 {
curpos.Next = &ListNode{Val: overflow, Next: nil}
}
break
}
if l1 == nil {
l1 = &ListNode{Val: 0, Next: nil}
}
if l2 == nil {
l2 = &ListNode{Val: 0, Next: nil}
}
curpos.Next = &ListNode{}
curpos = curpos.Next
}
return ret
}