两数相加 – LeetCode2

题目

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 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
}

相关链接

https://leetcode-cn.com/problems/add-two-numbers

0 评论
最新
最旧 最多投票
内联反馈
查看所有评论
滚动至顶部