2. 两数相加

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

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

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

示例:

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

错误解法:

错误思路: 将数字读出来还原, 进行加法得到sum, 再拆分sum写入到新的链表中

错误原因: 大数字会导致内存溢出

func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
if l1 == nil || l2 == nil {
return nil
}
l := new(ListNode)
rst := l pow10 := func(a int) int {
if a == 0 {
return 1
}
rst := 1
for i := 1; i <= a; i++ {
rst *= 10
}
return rst
} getInt := func(l *ListNode) (int) {
if l == nil {
return 0
}
nums := []int{}
for l != nil {
nums = append(nums, l.Val)
l = l.Next
}
rst := 0
for k, v := range nums {
rst += pow10(k) * v
}
return rst
} rstNum := getInt(l1) + getInt(l2)
rstArr := strconv.Itoa(rstNum)
bits := len(rstArr)
for i := 1; i <= bits; i++ {
l.Val = rstNum / pow10(i-1) % 10
if i == bits {
break
}
l.Next = new(ListNode)
l = l.Next
}
return rst
}

正确解法:

思路: 直接模拟加法过程

package main

import "fmt"

type ListNode struct {
Val int
Next *ListNode
} /*
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
*/ //[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1]
//[5,6,4] func main() {
l1 := new(ListNode)
l2 := new(ListNode)
tmp1 := l1
tmp2 := l2
nums1 := []int{3, 5, 2}
nums2 := []int{5,6,4} for i := 0; i < len(nums1); i++ {
tmp1.Val = nums1[i]
if i == len(nums1)-1 {
break
}
tmp1.Next = new(ListNode)
tmp1 = tmp1.Next
}
for i := 0; i < len(nums2); i++ {
tmp2.Val = nums2[i]
if i == len(nums2)-1 {
break
}
tmp2.Next = new(ListNode)
tmp2 = tmp2.Next
} fmt.Println(l2.getInt())
fmt.Println(l1.getInt())
l2 = addTwoNumbers(l1, l2)
fmt.Println(l2.getInt()) } func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
if l1 == nil || l2 == nil {
return nil
} l := new(ListNode)
l.Val = 0
tmp := l
flag := 0 // flag标志位, 模拟加法中的进位加1 for {
num := l1.Val + l2.Val + tmp.Val
if num >= 10 {
tmp.Val = num % 10
flag = 1
} else {
tmp.Val = num
} if l1.Next == nil && l2.Next == nil {
break
}
l1 = l1.Next
l2 = l2.Next
if l1 == nil {
l1 = new(ListNode)
l1.Val = 0
}
if l2 == nil {
l2 = new(ListNode)
l2.Val = 0
} tmp.Next = new(ListNode)
if flag == 1 {
tmp.Next.Val = 1
flag = 0
} else {
tmp.Next.Val = 0
}
tmp = tmp.Next
}
if flag == 1 { // 这个判断一定要加, 因为 5 + 5 返回 0,1
tmp.Next = new(ListNode)
tmp.Next.Val = 1
} return l
} func (l *ListNode) Length() int {
if l == nil {
return 0
}
i := 0
for l != nil {
l = l.Next
i++
}
return i
} // 返回链表中的值
func (l *ListNode) getInt() (int) {
if l == nil {
return 0
}
nums := []int{}
for l != nil {
nums = append(nums, l.Val)
l = l.Next
}
rst := 0
for k, v := range nums {
rst += pow10(k) * v
}
return rst
} // 返回10的几次方 <---- 大数字的情况下在这里首先溢出, 写在这里只为了测试用
func pow10(a int) int {
if a == 0 {
return 1
}
rst := 1
for i := 1; i <= a; i++ {
rst *= 10
}
return rst
}

/* 字体问题: 有些分不清 l 和 1,建议复制到IDE中进行查看 */

LeetCode Golang 2. 两数相加的更多相关文章

  1. LeetCode :2.两数相加 解题报告及算法优化思路

    题目连接:2.两数相加 题意 题目难度标为 中等, 因为题意上有一部分理解难度,以及需要数据结构的链表基础. 还不知道到链表的童鞋可以粗略的看下百度百科或者是翻出数据结构的书看一看,通俗一点的语言来解 ...

  2. LeetCode | No.2 两数相加

    ​题目描述 给出两个非空的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序的方式存储的,并且它们的每个节点只能存储一位数字.如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和 ...

  3. LeetCode刷题--两数相加(中等)

    题目描述 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表 ...

  4. LeetCode练习2 两数相加

    问题如下: 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来 ...

  5. 【LeetCode】2. 两数相加

    题目 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字.   如果,我们将这两个数相加起来,则会返回一个新的链表来表 ...

  6. Leetcode:2. 两数相加

    题目描述: 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来 ...

  7. python刷LeetCode:2.两数相加

    难度等级:中等 题目描述: 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返 ...

  8. LeetCode 2:两数相加 Add Two Numbers

    ​给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字.如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和 ...

  9. leetcode题目2.两数相加(中等)

    题目描述: 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来 ...

随机推荐

  1. vc++图像保存,重绘

    新建mfc应用程序,单文档 增加绘图 分别增加命令响应 添加成员变量UINIT 图形可以运行,如何保存呢?(一个集合类,CPtArt) 用一个类的对象来保存一个图形的三个要素 所以插入一个新的类(通常 ...

  2. js 背景从无到黑的渐变 字从白到黑的渐变

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  3. Linux搭建Jenkins

    1.添加存储库 yum的repo中默认没有Jenkins,需要先将Jenkins存储库添加到yum repos,执行下面的命令: 使用wget -O下载并以不同的文件名保存 [root@besttes ...

  4. Laravel的路由功能

    只能在当前方法内加载视图和URL跳转!

  5. Java基础学习总结(37)——Java23中设计模式(Design Patterns)详解

    设计模式(Design Patterns) --可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...

  6. Python - 采用 contextmanage 简化代码

    contextlib.contextmanage Python 2.7 documents: https://docs.python.org/2.7/library/contextlib.html?h ...

  7. C#中的IEnumerable<T>知识点

    1.扩展IEnumerable<T>的方法 使继承了IEnumeralbe<T>的接口有了MyS方法 static class MySum {                  ...

  8. 因一段JavaScript代码引发的闲扯

    前两天,一朋友给我发了一段JavaScript代码: function f1(){ var n=999; nAdd=function(){ n+=1 }; function f2(){ alert(n ...

  9. Methods Collection of Enumerating Com Port in Windows, by C

    According to this stack overflow thread, PJ Naughter has implemented 9 methods to emunerate com port ...

  10. 受 SQLite 多年青睐,C 语言到底好在哪儿?

    SQLite 近日发表了一篇博文,解释了为什么多年来 SQLite 一直坚持用 C 语言来实现,以下是正文内容: C 语言是最佳选择 从2000年5月29日发布至今,SQLite 一直都是用 C 语言 ...