您的位置:首页 > 编程语言 > Go语言

leetcode刷题之两数相加(go实现)

2019-07-03 16:15 363 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/u010110632/article/details/94570392

题目来自于LeetCode(https://leetcode-cn.com)。

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

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

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

示例:

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

注:这道题有助于理解链表,帮助复习链表的操作

解法一:暴力法(耗时12 ms,内存5.7M,后期看能否优化)

先讲两个链表中的值取出来,分别存在slice中。比较两个slice的长度,进行调换(将长度长的赋值给a,端的给b)。循环相加,并将结果存入a中(这里设置了一个标杆 j ,用来表示上一轮循环是否大于等于10)。最后循环a,将结果一一放入到链表中(这里需要在里面取到链表的尾部)。

代码如下:

[code]/**
* Definition for singly-linked list.
* type ListNode struct {
*     Val int
*     Next *ListNode
* }
*/
func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
var a []int
for {
if l1 != nil{
a = append(a,l1.Val)
l1 = l1.Next
}else{
break
}
}
var b []int
for {
if l2 != nil{
b = append(b,l2.Val)
l2 = l2.Next
}else{
break
}
}

alen := len(a)
blen := len(b)

j := 0
//检测长度,符合条件,则交换变量值,并重新获得长度值
if alen < blen {
a,b = b,a
alen = len(a)
blen = len(b)
}

for i:=0;i<blen;i++{
num := a[i] + b[i] + j
if num >= 10 {
a[i] = num - 10
j = 1
}else{
a[i] = num
j = 0
}
}
for m:=blen;m<alen;m++{
num := a[m] + j
if num >= 10 {
a[m] = num -10
j = 1
}else{
a[m] = num
j = 0
}
}
//最后接测j,大于0说明最后两个元素相加大于10
if j > 0{
a = append(a,1)
}

var l3  = &ListNode{Val:-1}
l5 := l3 //这里赋值,因为是指针,所以l3的更改能体现到l5上,最后返回l5
for _,v := range a{
if l3.Val == -1{
l3.Val = v
continue
}
var l4 = new(ListNode)
l4.Val = v
l4.Next = nil
l3.Next = l4
l3 = l3.Next //将l3的指针指向链表尾部
}
return l5
}

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: