LeetCode练习记录- 两数相加(kotlin)

2 篇文章 0 订阅
2 篇文章 0 订阅

题目描述

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

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

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

示例:

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

题目题解(kotlin)

解一:递归

代码源码

 private fun addTwoNode(l1: ListNode?, l2: ListNode?, hasExtra: Boolean): ListNode? {
            var resultNode: ListNode? = null
            if (l1 == null && l2 != null) {
                return if (hasExtra) {
                    resultNode = ListNode((l2.`val` + 1) % 10)
                    resultNode.next = addTwoNode(
                        null, l2.next,
                        l2.`val` + 1 >= 10
                    )
                    resultNode
                } else {
                    l2
                }
            }

            if (l2 == null && l1 != null) {
                return if (hasExtra) {
                    resultNode = ListNode((l1.`val` + 1) % 10)
                    resultNode.next = addTwoNode(
                       null, l1.next,
                        l1.`val` + 1 >= 10
                    )
                    resultNode
                } else {
                    l1
                }
            }

            if (l2 == null && l1 == null) {
                return if (hasExtra) ListNode(1) else null
            }


            var result = 0
            result = if (hasExtra) {
                (l1!!.`val` + l2!!.`val` + 1) % 10
            } else {
                (l1!!.`val` + l2!!.`val`) % 10
            }

            resultNode = ListNode(result)

            resultNode.next = addTwoNode(
                l1.next, l2.next, if (hasExtra) {
                    l1.`val` + l2.`val` + 1 >= 10
                } else {
                    (l1.`val` + l2.`val`) >= 10
                }
            )
            return resultNode
        }
    }

反思

代码写的很复杂也很冗余,思路不清晰,不停的在根据测试用例的错误结果去修正逻辑,最近看了递归的算法,就首先想到了用递归去做,做的很不理想,明天来优化一下这个递归的做法。

解二:循环

代码源码

class Sixteen2Test {

    companion object {
        @JvmStatic
        fun main(args: Array<String>) {
            val l1 = ListNode(2)
            val l1_1 = ListNode(4)
            val l1_2 = ListNode(3)

            l1.next = l1_1
            l1_1.next = l1_2

            val l2 = ListNode(5)
            val l2_1 = ListNode(6)
            val l2_2 = ListNode(4)

            l2.next = l2_1
            l2_1.next = l2_2

            addTwoNumbers(l1, l2)
        }

        fun addTwoNumbers(l1: ListNode, l2: ListNode): ListNode? {

            val headNode = ListNode(0)
            var p: ListNode? = l1
            var q: ListNode? = l2
            var result: ListNode? = headNode
            var flag: Int = 0 // 标志位:0:没有进位;1:有进位

            var pValue: Int
            var qValue: Int
            var sumValue: Int

            while (p != null || q != null) {
                pValue = p?.`val` ?: 0
                qValue = q?.`val` ?: 0
                sumValue = pValue + qValue + flag

                flag = sumValue / 10
                result?.next = ListNode(sumValue % 10)
                
                p = p?.next
                q = q?.next
                result = result?.next
            }

            if (flag > 0) {
                result?.next = ListNode(flag)
            }

            return headNode.next
        }
    }

}

反思

  • 反思:这道题在做的过程中,犯了一个错误,那就是没有将最原始的node节点保存下来
  • 直接对result进行操作,导致最后result指向了一个null的节点
  • 改进,headNode,将其赋值给result
  • 错误:其实这样子在操作result的时候也是在操作headNode,毕竟非基本类型,他们指向的存储数据的内存是同一块
  • 改进:用headNode去保存头节点,但是在操作的时候,将result的next作为一个被操作对象
  • 正确:将头节点保存完好,在需要打印的时候,只需要去除头节点即可,即将headNode的next进行return
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值