0

0

如何使用golang语言来实现链表求和的算法

PHPz

PHPz

发布时间:2023-04-25 16:18:02

|

1848人浏览过

|

来源于php中文网

原创

链表求和是一道常见的算法问题,它的基本思路是将两个链表中的数位相加,得出一个新的链表表示它们的和,这个和可能涉及到在进位的情况下的数位增加。

本文将介绍如何使用golang语言来实现链表求和的算法。

首先,我们需要定义一个链表节点的结构体,它包含两个字段:val表示节点的值,next表示指向下一个节点的指针。

type ListNode struct {
    Val  int
    Next *ListNode
}

接下来,我们可以定义一个函数AddTwoNumbers,它接收两个链表l1和l2,并返回它们的和所构成的新链表。

func AddTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
    carry := 0  // 进位值
    dummy := &ListNode{Val: 0, Next: nil}
    curr := dummy  // 当前节点

    for l1 != nil || l2 != nil {
        // 如果两个链表长度不相等,在较短的链表上添加一个0节点,使两个链表长度相等
        if l1 == nil {
            l1 = &ListNode{Val: 0, Next: nil}
        }
        if l2 == nil {
            l2 = &ListNode{Val: 0, Next: nil}
        }

        sum := l1.Val + l2.Val + carry
        carry = sum / 10  // 更新进位值
        curr.Next = &ListNode{Val: sum % 10, Next: nil}
        curr = curr.Next

        l1 = l1.Next
        l2 = l2.Next
    }

    // 最后如果还有进位,添加一个进位节点
    if carry > 0 {
        curr.Next = &ListNode{Val: carry, Next: nil}
    }

    return dummy.Next
}

在这个函数中,我们用carry变量来表示进位值,初始值为0。我们定义一个哑节点dummy,它指向新链表的头部,同时定义一个指针curr,用来指向新链表的当前节点,初始值指向哑节点。然后我们使用for循环来遍历两个链表,此时我们需要注意,如果两个链表长度不相等,我们需要在较短的链表上添加一个0节点,使两个链表长度相等。接下来,我们对链表中同一位置的节点进行相加,并将进位值和当前节点的值相加,得到一个新的sum值,它的十位数可能进位到下一次相加。因此,我们需要更新carry的值。同时,我们将sum的个位数作为新节点的值,并将curr指针指向这个新建的节点。最后,我们让curr指针指向新链表的下一个节点,再将l1和l2的指针移向它们的下一个节点。重复这个过程直至两个链表全部遍历结束。最后,如果还有进位,添加一个进位节点。最后返回dummy.Next,它代表新链表的头节点。

立即学习go语言免费学习笔记(深入)”;

接下来我们可以定义测试函数来测试AddTwoNumbers函数。

情感家园企业站5.0 多语言多风格版
情感家园企业站5.0 多语言多风格版

一套面向小企业用户的企业网站程序!功能简单,操作简单。实现了小企业网站的很多实用的功能,如文章新闻模块、图片展示、产品列表以及小型的下载功能,还同时增加了邮件订阅等相应模块。公告,友情链接等这些通用功能本程序也同样都集成了!同时本程序引入了模块功能,只要在系统默认模板上创建模块,可以在任何一个语言环境(或任意风格)的适当位置进行使用!

下载
func TestAddTwoNumbers(t *testing.T) {
    l1 := &ListNode{Val: 2, Next: &ListNode{Val: 4, Next: &ListNode{Val: 3, Next: nil}}}
    l2 := &ListNode{Val: 5, Next: &ListNode{Val: 6, Next: &ListNode{Val: 4, Next: nil}}}
    l3 := AddTwoNumbers(l1, l2)
    if l3.Val != 7 || l3.Next.Val != 0 || l3.Next.Next.Val != 8 || l3.Next.Next.Next != nil {
        t.Errorf("AddTwoNumbers(%v, %v) = %v, want %v", l1, l2, l3, &ListNode{Val: 7, Next: &ListNode{Val: 0, Next: &ListNode{Val: 8, Next: nil}}})
    }
}

在这个测试函数中,我们创建两个链表l1和l2,它们分别代表342和465。我们调用AddTwoNumbers函数,计算它们的和,得到新链表l3,其值应该是708。我们使用if语句对l3的值进行检查,如果与期望不符,就使用t.Errorf方法记录错误信息。

将上述代码保存在sumLinkedList.go文件中,运行测试函数,即可得到输出结果:

$ go test -v
=== RUN   TestAddTwoNumbers
--- PASS: TestAddTwoNumbers (0.00s)
PASS
ok      sumLinkedList  0.360s

通过测试函数,我们可以确认链表求和的算法实现是正确的。

本文详细介绍了如何使用golang实现链表求和算法,包括定义链表节点的结构体,以及实现AddTwoNumbers函数的具体步骤。这个算法是面试中经常会遇到的问题,有了自己的实现,可以更好地进行准备,同时也帮助深化对链表和指针的理解。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
vlookup函数使用大全
vlookup函数使用大全

本专题整合了vlookup函数相关 教程,阅读专题下面的文章了解更多详细内容。

26

2025.12.30

金山文档相关教程
金山文档相关教程

本专题整合了金山文档相关教程,阅读专题下面的文章了解更多详细操作。

28

2025.12.30

PS反选快捷键
PS反选快捷键

本专题整合了ps反选快捷键介绍,阅读下面的文章找到答案。

25

2025.12.30

表格中一行两行的方法
表格中一行两行的方法

本专题整合了表格中一行两行的相关教程,阅读专题下面的文章了解更多详细内容。

3

2025.12.30

cpu温度过高解决方法大全
cpu温度过高解决方法大全

本专题整合了cpu温度过高相关教程,阅读专题下面的文章了解更多详细内容。

5

2025.12.30

ASCII码介绍
ASCII码介绍

本专题整合了ASCII码相关内容,阅读专题下面的文章了解更多详细内容。

31

2025.12.30

GPS是什么
GPS是什么

本专题整合了GPS相关内容,阅读专题下面的文章了解更多详细内容。

3

2025.12.30

wifi拒绝接入
wifi拒绝接入

本专题整合了wifi拒绝接入相关教程,阅读下面的文章了解更多详细方法。

9

2025.12.30

丰网速运介绍
丰网速运介绍

本专题整合了丰网速运查询入口以及相关内容,阅读专题下面的文章了解更多内容。

3

2025.12.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号