LeetCode.2. 两数相加
题目描述:
2. 两数相加 - 力扣(LeetCode) (leetcode-cn.com)
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 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
- 题目数据保证列表表示的数字不含前导零
思路分析
模拟
这种类似的题目,使用模拟法太容易理解了,毕竟上学的时候就一直与这些打交道的。
我们就按照平时手算加法的那样去算就行了,至于进位什么的,这是最基本的需要注意的地方。
简单来说就是我们同时遍历2个链表,逐位计算它们的和,并与当前位置的进位值相加。
这里有个注意点就是最后的时候如果还有进位的话,需要在链表最后再加一个节点。
AC代码
/**
* Example:
* var li = ListNode(5)
* var v = li.`val`
* Definition for singly-linked list.
* class ListNode(var `val`: Int) {
* var next: ListNode? = null
* }
*/
class Solution {
fun addTwoNumbers(l1: ListNode?, l2: ListNode?): ListNode? {
var l1 = l1
var l2 = l2
val dummy = ListNode(0)
var cur: ListNode? = dummy
var carry = 0
while (l1 != null || l2 != null) {
val x = l1?.`val` ?: 0
val y = l2?.`val` ?: 0
var sum = x + y + carry
carry = sum / 10
sum = sum % 10
cur!!.next = ListNode(sum)
cur = cur.next
if (l1 != null) l1 = l1.next
if (l2 != null) l2 = l2.next
}
// 处理最后一个的进位(当循环结束后,是不是还可能会有一个进位)
if (carry == 1) {
cur!!.next = ListNode(carry)
}
return dummy.next
}
}
总结
总的来说还是非常简单的,按竖列式加法规则,从链表第一位开始,完全吻合。
参考
转载自:https://juejin.cn/post/7002619546871791646