Go語言程式:合併兩個已排序的連結串列


在這篇文章中,我們將編寫Go語言程式來合併兩個已排序的連結串列。連結串列是一組包含資料值和指向列表中下一個節點的next指標的兩個欄位。

連結串列是一種動態資料結構,具有兩個指標head和tail,其中head指向第一個值,tail指向最後一個值。在這裡,我們將使用兩個示例來合併已排序的連結串列。

演示

此演示表示兩個已排序的連結串列“LIST1”和“LIST2”。我們需要將這兩個連結串列合併成一個。

List 1: 1, 2,4
List 2: 1, 3, 4
After merge: 1 1 2 3 4 4

演算法

  • 步驟1 − 建立一個名為ListNode的結構體,它包含兩個欄位:節點的值和指向下一個節點的指標。

  • 步驟2 − 建立一個名為mergeTwoLists的函式,該函式有兩個輸入引數list1和list2,它們是指向ListNode結構體的指標。

  • 步驟3 − 在此步驟中,建立一個虛擬節點,用作新連結串列的頭部,並建立一個尾部節點來遍歷連結串列。

  • 步驟4 − 然後,使用for迴圈檢查兩個列表是否都不為空,如果list1的值小於list2的值,則將tail.next設定為l1,並將l1設定為l1.next。

  • 步驟5 − 如果條件不滿足,則對於list2,將tail.next設定為l2,並將l2設定為l2.next。

  • 步驟6 − 將tail設定為tail.next,如果列表中還有任何剩餘元素,則將下一個tail設定為l1或l2。最後,將合併列表的頭部返回給函式。

  • 步驟7 − 在main函式中,建立兩個具有所需值的列表l1和l2,並將它們作為引數傳遞給函式,合併後的結果將被接收。

  • 步驟8 − 對合並後的列表執行迴圈,並在每次迭代中列印新列表的值。列印語句使用fmt包中的printf函式執行。

示例1

在此示例中,將建立一個虛擬節點指向頭部,並建立一個尾部節點來遍歷列表並使用next指標和值欄位將它們合併。合併後的列表將使用for迴圈列印。

package main

import "fmt"

type ListNode struct {
   value int
   next  *ListNode
}

func mergeTwoLists(l1 *ListNode, l2 *ListNode) *ListNode {
	
   dummy := &ListNode{}

	   tail := dummy

   for l1 != nil && l2 != nil {
      if l1.value < l2.value {
         tail.next = l1
         l1 = l1.next
      } else {
         tail.next = l2
         l2 = l2.next
      }
      tail = tail.next
   }
	
   if l1 != nil {
      tail.next = l1
   } else {
      tail.next = l2
   }

   return dummy.next
}

func main() {
	
   l1 := &ListNode{value: 1}
   l1.next = &ListNode{value: 2}
   l1.next.next = &ListNode{value: 4}

   l2 := &ListNode{value: 1}
   l2.next = &ListNode{value: 3}
   l2.next.next = &ListNode{value: 4}
	
   merged := mergeTwoLists(l1, l2)
   fmt.Println("The merged list l1 and l2 is:")
   for merged != nil {
      fmt.Printf("%d ", merged.value)
      merged = merged.next
   }
}

輸出

The merged list l1 and l2 is:
1 1 2 3 4 4

示例2

在此示例中,將使用遞迴方法對第一個和第二個已排序列表進行合併。合併後的列表將使用for迴圈列印。

package main

import "fmt"

type ListNode struct {
   value int
   next  *ListNode
}

func mergeTwoLists(l1 *ListNode, l2 *ListNode) *ListNode {
	
   if l1 == nil {
      return l2
   }
   if l2 == nil {
      return l1
   }
	
   if l1.value < l2.value {
      l1.next = mergeTwoLists(l1.next, l2)
      return l1
   } else {
      l2.next = mergeTwoLists(l1, l2.next)
      return l2
   }
}

func main() {
	
   l1 := &ListNode{value: 1}
   l1.next = &ListNode{value: 2}
   l1.next.next = &ListNode{value: 4}

   l2 := &ListNode{value: 1}
   l2.next = &ListNode{value: 3}
   l2.next.next = &ListNode{value: 4}
	
   merged := mergeTwoLists(l1, l2)
   fmt.Println("The new merged list is:")
   for merged != nil {
      fmt.Printf("%d ", merged.value)
      merged = merged.next
   }
}

輸出

The new merged list is:
1 1 2 3 4 4

結論

在這篇文章中,我們研究瞭如何使用兩個示例執行合併兩個已排序連結串列的程式。在第一個示例中,我們使用尾節點遍歷列表併合並節點,而在第二個示例中,我們使用遞迴來合併兩個列表。

更新於:2023年7月20日

646 次瀏覽

開啟您的職業生涯

完成課程獲得認證

開始學習
廣告