likes
comments
collection
share

LeetCode.2. 两数相加

作者站长头像
站长
· 阅读数 32

题目描述:

2. 两数相加 - 力扣(LeetCode) (leetcode-cn.com)

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

请你将两个数相加,并以相同形式返回一个表示和的链表。

你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例 1:

LeetCode.2. 两数相加

输入: 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
    }
}

总结

总的来说还是非常简单的,按竖列式加法规则,从链表第一位开始,完全吻合。

参考

两数相加 - 两数相加 - 力扣(LeetCode) (leetcode-cn.com)

2. 两数相加 - 两数相加 - 力扣(LeetCode) (leetcode-cn.com)

转载自:https://juejin.cn/post/7002619546871791646
评论
请登录