算法:两数相加


题目:两数相加

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

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

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

示例:

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

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

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

分析

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

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

解答

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
/**
* 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
}
}

文章作者: zhegnhuan
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 zhegnhuan !
 上一篇
算法:最小覆盖子字符串 算法:最小覆盖子字符串
题目:最小覆盖子字符串给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字符的最小子串。 示例: 12输入: S = "ADOBECODEBANC", T = "A
2020-05-23
下一篇 
算法:合并两个有序链表 算法:合并两个有序链表
题目:合并两个有序链表将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例: 12输入:1->2->4, 1->3->4输出:1->1->2->3-&
2020-05-23
  目录