📑 题目:2. 两数相加

🚀 本题 LeetCode 传送门

题目大意

2 个逆序的链表,要求从低位开始相加,得出结果也逆序输出,返回值是逆序结果链表的头结点。

解题思路

需要注意的是各种进位问题。

极端情况,例如

  1. Input: (9 -> 9 -> 9 -> 9 -> 9) + (1 -> )
  2. Output: 0 -> 0 -> 0 -> 0 -> 0 -> 1

为了处理方法统一,可以先建立一个虚拟头结点,这个虚拟头结点的 Next 指向真正的 head,这样 head 不需要单独处理,直接 while 循环即可。另外判断循环终止的条件不用是 p.Next != nil,这样最后一位还需要额外计算,循环终止条件应该是 p != nil。

代码

  1. package leetcode
  2. /**
  3. * Definition for singly-linked list.
  4. * type ListNode struct {
  5. * Val int
  6. * Next *ListNode
  7. * }
  8. */
  9. func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
  10. head := &ListNode{Val: 0}
  11. n1, n2, carry, current := 0, 0, 0, head
  12. for l1 != nil || l2 != nil || carry != 0 {
  13. if l1 == nil {
  14. n1 = 0
  15. } else {
  16. n1 = l1.Val
  17. l1 = l1.Next
  18. }
  19. if l2 == nil {
  20. n2 = 0
  21. } else {
  22. n2 = l2.Val
  23. l2 = l2.Next
  24. }
  25. current.Next = &ListNode{Val: (n1 + n2 + carry) % 10}
  26. current = current.Next
  27. carry = (n1 + n2 + carry) / 10
  28. }
  29. return head.Next
  30. }