「这是我参与2022首次更文挑战的第24天,活动详情查看:2022首次更文挑战」。
1.题目
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外,这两个数都不会以 0 开头
2. 思路
- 既然有两个链表,那么结果我们就要另外新起一个链表去存储,所以我们可以new一个Node去存储我们的结果
- 通过示例代码我们可以发现,其实只是将各个位置的数
进行相加并将结果通过头插法插入链表即可。 - 不过注意如果有进位的话,一定要保留进位!并且加入到下一个计算当中。
func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
result := new(ListNode)
cur := result
c := 0
(1) for l1 != nil || l2 != nil || c>0 {
(2) sum := 0
(3) if l1 != nil {
sum += l1.Val
l1 = l1.Next
}
(4) if l2 != nil {
sum += l2.Val
l2 = l2.Next
}
(5) sum += c
(6) cur.Next = &ListNode{Val: sum % 10}
(7) cur = cur.Next
(8) c = sum / 10
}
(9) return result.Next
}
- (1) 两个链表进行循环,如果下一个不是空的话,也可以进行。另外如果有进位的话(c>0),也是可以进行的。因为可能最后一位相加>10了,这也是会忽略的点。
- (2) 对每一轮的加分进行sum,并每一轮都初始为0
- (3) 对l1链表进行求值并进行sum操作
- (4) 对l2链表进行求值并进行sum操作
- (5) 这个c就是进位的意思,如果有c那么就是说进位,sum也一样要加上c
- (6) cur的下一个Node的值,就是sum%10的值,就是余数
- (7) cur就可以继续推进
- (8) c就要赋值成sum/10,看看是否有进位
- (9) 返回结果