首頁 > 後端開發 > Golang > 如何使用golang語言來實現鍊錶求和的演算法

如何使用golang語言來實現鍊錶求和的演算法

PHPz
發布: 2023-04-25 16:50:26
原創
793 人瀏覽過

鍊錶求和是一道常見的演算法問題,它的基本思路是將兩個鍊錶中的數位相加,得出一個新的鍊錶表示它們的和,這個和可能涉及到在進位的情況下的數位增加。

本文將介紹如何使用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語言來實現鍊錶求和的演算法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板