Maison > Article > développement back-end > Comment utiliser le langage Golang pour implémenter l'algorithme de sommation des listes chaînées
链表求和是一道常见的算法问题,它的基本思路是将两个链表中的数位相加,得出一个新的链表表示它们的和,这个和可能涉及到在进位的情况下的数位增加。
本文将介绍如何使用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,它代表新链表的头节点。
接下来我们可以定义测试函数来测试AddTwoNumbers函数。
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函数的具体步骤。这个算法是面试中经常会遇到的问题,有了自己的实现,可以更好地进行准备,同时也帮助深化对链表和指针的理解。
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!