【力扣】两数相加 [Go语言]

119 阅读2分钟

「这是我参与2022首次更文挑战的第24天,活动详情查看:2022首次更文挑战」。

1.题目

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外,这两个数都不会以 0 开头

image.png

2. 思路

  1. 既然有两个链表,那么结果我们就要另外新起一个链表去存储,所以我们可以new一个Node去存储我们的结果
  2. 通过示例代码我们可以发现,其实只是将各个位置的数进行相加并将结果通过头插法插入链表即可。
  3. 不过注意如果有进位的话,一定要保留进位!并且加入到下一个计算当中。
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) 返回结果