链表求和是一道常见的算法问题,它的基本思路是将两个链表中的数位相加,得出一个新的链表表示它们的和,这个和可能涉及到在进位的情况下的数位增加。
本文将介绍如何使用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函数。
PHP是一种功能强大的网络程序设计语言,而且易学易用,移植性和可扩展性也都非常优秀,本书将为读者详细介绍PHP编程。 全书分为预备篇、开始篇和加速篇三大部分,共9章。预备篇主要介绍一些学习PHP语言的预备知识以及PHP运行平台的架设;开始篇则较为详细地向读者介绍PKP语言的基本语法和常用函数,以及用PHP如何对MySQL数据库进行操作;加速篇则通过对典型实例的介绍来使读者全面掌握PHP。 本书
472
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函数的具体步骤。这个算法是面试中经常会遇到的问题,有了自己的实现,可以更好地进行准备,同时也帮助深化对链表和指针的理解。
以上就是如何使用golang语言来实现链表求和的算法的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号