LeetCode Golang 2. 两数相加
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. 两数相加的更多相关文章
- LeetCode :2.两数相加 解题报告及算法优化思路
题目连接:2.两数相加 题意 题目难度标为 中等, 因为题意上有一部分理解难度,以及需要数据结构的链表基础. 还不知道到链表的童鞋可以粗略的看下百度百科或者是翻出数据结构的书看一看,通俗一点的语言来解 ...
- LeetCode | No.2 两数相加
题目描述 给出两个非空的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序的方式存储的,并且它们的每个节点只能存储一位数字.如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和 ...
- LeetCode刷题--两数相加(中等)
题目描述 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表 ...
- LeetCode练习2 两数相加
问题如下: 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来 ...
- 【LeetCode】2. 两数相加
题目 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表 ...
- Leetcode:2. 两数相加
题目描述: 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来 ...
- python刷LeetCode:2.两数相加
难度等级:中等 题目描述: 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返 ...
- LeetCode 2:两数相加 Add Two Numbers
给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字.如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和 ...
- leetcode题目2.两数相加(中等)
题目描述: 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来 ...
随机推荐
- 为my_string类创建复制构造函数copy constructor ,拷贝函数名和类同名
为下面的my_string类创建一个复制构造函数,并将定义该类的代码提交. my_string类的定义: class my_string { char *s; public: my_string(ch ...
- C++基础 (10) 第十天 C++中类型转换 异常 栈解旋 io操作
1之前内容的回顾 C语言中的类型转换(int)a 强转可读性太差了 C++把()拆分成了四种转换方式 static_cast static_cast在编译器编译阶段就进行转换了 2.dynamic_ ...
- php的优缺点(转)
1. 跨平台,性能优越,跟Linux/Unix结合别跟Windows结合性能强45%,并且和很多免费的平台结合非常省钱,比如LAMP(Linux /Apache/Mysql/PHP)或者FAMP(Fr ...
- [bzoj3743 Coci2015] Kamp(树形dp)
传送门 Description 一颗树n个点,n-1条边,经过每条边都要花费一定的时间,任意两个点都是联通的. 有K个人(分布在K个不同的点)要集中到一个点举行聚会. 聚会结束后需要一辆车从举行聚会的 ...
- Oracle数据库性能优化基础
1.数据处理分类OLTP,OLAP 2.Oracle特性 3.数据库优化方法论/原则 方法论:自顶向下优化和自底向上优化 3.1 自顶向下优化 3.2 自底向上优化 对于多年的老系统出现性能问题时,就 ...
- 《你又怎么了我错了行了吧》【Alpha】Scrum meeting 5
第五天 日期:2019/6/18 前言: 第5次会议在女生宿舍召开 冲刺第5天,对所有工作做了总结.继续完善编码工作. 1.1 今日完成任务情况以及明天任务安排 姓名 当前阶段任务 下一阶段任务 刘 ...
- Java中发邮件的6种方法
1.官方标准JavaMail Sun(Oracle)官方标准,功能强大,用起来比较繁琐. 官方资料:http://www.oracle.com/technetwork/java/javamail/in ...
- 【codeforces 723F】st-Spanning Tree
[题目链接]:http://codeforces.com/contest/723/problem/F [题意] 给你一张图; 让你选择n-1条边; 使得这张图成为一颗树(生成树); 同时s的度数不超过 ...
- SQL优化的思路及基本原则(mysql)
SQL优化的思路: 1.优化更需要优化的sql: 2.定位优化对象的性能瓶颈:优化前需了解查询的瓶颈是IO还是CPU,可通过PROFILING很容易定位查询的瓶颈. 3.明确优化目标: 4.从 ...
- spring 整合freemarker 实现模板继承
<!--freemarker 配置--> <bean id="freemarkerConfig" class="org.springframework. ...