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

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

本文将介绍如何使用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函数的具体步骤。这个算法是面试中经常会遇到的问题,有了自己的实现,可以更好地进行准备,同时也帮助深化对链表和指针的理解。

以上就是如何使用golang语言来实现链表求和的算法的详细内容,更多请关注其它相关文章!