题目
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例 1: 输入:l1 = [2,4,3], l2 = [5,6,4] 输出:[7,0,8] 解释:342 + 465 = 807.
示例 2: 输入:l1 = [0], l2 = [0] 输出:[0]
示例 3: 输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9] 输出:[8,9,9,9,0,0,0,1]
提示: 每个链表中的节点数在范围 [1, 100] 内 0 <= Node.val <= 9 题目数据保证列表表示的数字不含前导零
题解
golang
func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode { // 定义结果链表头指针 var head *ListNode // 定义结果链表尾指针 tail := &ListNode{} // carry 用于保存进位 carry := 0 for l1 != nil || l2 != nil { // 依次获取l1, l2 相同位置的值,n1, n2 n1, n2 := 0, 0 if l1 != nil { n1 = l1.Val l1 = l1.Next } if l2 != nil { n2 = l2.Val l2 = l2.Next } // n1, n2 以及 carry(上一位计算的进位) 求和,与10的余数,则为最终结果该位上的值,除10的值,则为进位,用carry存储 // 例如 19 + 6, 第一步: n1 = 9, n2 = 6, carry = 0, 最终结果个位为 5,进位1 (carry = 1) 第二步: n1 = 1, n2 = 0, n1 + n2 + carry = 2 // 最终结果: 19 + 6 = 25 sum := n1 + n2 + carry sum, carry = sum % 10, sum / 10 if head == nil { head = &ListNode{Val: sum} tail = head } else { tail.Next = &ListNode{Val: sum} tail = tail.Next } } // 若各位皆已经计算,但carry中还有值,则最高位为carry. 例如: 98 + 9 = 107 (carry = 1) if carry > 0{ tail.Next = &ListNode{Val: carry} } return head }