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 次浏览

开启您的职业生涯

完成课程获得认证

开始学习
广告
© . All rights reserved.