算法:链表两数相加

题目:两数相加

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

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

链接:https://leetcode-cn.com/problems/add-two-numbers/solution/liang-shu-xiang-jia-by-leetcode/
来源:力扣(LeetCode)

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

拓展:如果是按照逆序呢?例如834=(8->3->4)

分析

这道题目思路很简单,再创建一个链表,然后记住进位,最后把剩下的接到后面即可。

关于拓展题目,使用递归或者栈来把顺序颠倒即可。

解答

/**
 * 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? {
        if  (l1==null||l2==null) return null

        val numString = StringBuilder()
        var carry = 0
        var link1:ListNode? = l1
        var link2:ListNode? = l2
        while (link1!=null||link2!=null){
            val one = link1?.`val` ?: 0
            val two = link2?.`val` ?: 0
            var add = one+two+carry
            if (add>=10){
                carry = 1
                add %= 10
            }else carry = 0
            numString.append(add)

            link1?.let { link1 = it.next }
            link2?.let { link2 = it.next }
        }
        if (carry==1) numString.append(1)
        val linkNode : ListNode = 						ListNode(numString[0].toInt()-48)
        var point = linkNode
        for (i in 1 until numString.length){
            val node = ListNode(numString[i].toInt()-48)
            point.next = node
            point = node
        }
        point.next = null
        return linkNode
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_43766753/article/details/106298821
今日推荐