Golang 合并两个已排序链表

Golang 合并两个已排序链表

在本文中,我们将编写Go语言程序来合并两个已排序的链表。链表是一组具有值(即数据)和指向列表中下一个节点的下一个指针的两个字段。

链表是一种动态数据结构,具有两个指针head和tail,其中head指向第一个值,tail指向最后一个值。在这里,我们将使用两个示例来合并已排序的链表。

演示

这个演示代表了两个已排序的链表“LIST1”和“LIST2”。我们需要将这两个链表合并为一个。

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

步骤

  • 第一步 - 创建一个ListNode结构体,其中包含两个字段值,即节点的值和指向下个节点的指针

  • 第二步 - 创建一个名为mergeTwoLists的函数,它有两个输入参数,list1和list2,这两个参数指向ListNode结构体

  • 第三步 - 在这一步中,创建一个虚拟节点作为新列表的头部,以及一个尾部节点用于遍历列表

  • 第四步 - 然后,使用一个for循环来检查两个列表是否都不为空,然后检查列表一的值是否小于列表二的值,如果是,则设置tail.next为l1,并将l1设置为l1.next

  • 第五步 - 如果条件不满足,那么对于列表二,将tail.next设置为l2,并将l2设置为l2.next

  • 第六步 - 将tail设置为tail.next,并且如果列表中还剩余元素,则将下一个tail设置为l1或l2。最后,将合并后的列表头部返回给函数

  • 第七步 - 在主函数中,创建两个具有所需值的列表l1和l2,并将它们作为参数传递给函数,合并后的列表将作为输出接收

  • 第八步 - 在merged上运行一个循环,并在每次迭代中打印新列表的值。使用fmt包中的printf语句执行打印操作。

示例1

在这个示例中,将创建一个虚拟节点指向头部,创建一个尾部来遍历列表并使用next指针和value字段将它们合并。使用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

结论

在本文中,我们通过两个示例来演示如何执行合并两个已排序链表的程序。在第一个示例中,我们使用尾节点遍历链表并合并节点,而在第二个示例中,我们使用递归来合并两个链表。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程