golang合并无序链表

发布时间:2024-07-04 23:29:43

合并无序链表是在golang开发中常见的问题,本文将介绍如何使用golang进行无序链表的合并操作。

问题描述

给定两个无序链表head1和head2,如何将它们合并成一个有序链表?

解决方法

为了解决这个问题,我们可以使用双指针的方法。首先,我们需要定义一个新的链表头指针newHead和一个当前节点指针current,初始时newHead和current都指向nil。然后,我们从head1和head2的头节点开始遍历,比较两个节点的值的大小:

插入节点后,将current指针指向插入的新节点,并将current指针后移。

重复以上步骤,直到head1和head2都为空为止。最后,返回newHead指向的链表即可。

代码实现

下面是使用golang实现上述算法的代码:

```go type ListNode struct { Val int Next *ListNode } func mergeTwoLists(head1 *ListNode, head2 *ListNode) *ListNode { newHead := &ListNode{} current := newHead for head1 != nil && head2 != nil { if head1.Val <= head2.Val { current.Next = head1 head1 = head1.Next } else { current.Next = head2 head2 = head2.Next } current = current.Next } if head1 != nil { current.Next = head1 } if head2 != nil { current.Next = head2 } return newHead.Next } ```

测试样例

下面是几个测试样例:

```go func main() { // 创建链表1:1->3->4 head1 := &ListNode{Val: 1} head1.Next = &ListNode{Val: 3} head1.Next.Next = &ListNode{Val: 4} // 创建链表2:1->2->5 head2 := &ListNode{Val: 1} head2.Next = &ListNode{Val: 2} head2.Next.Next = &ListNode{Val: 5} result := mergeTwoLists(head1, head2) fmt.Println(result) } ```

输出结果为:1->1->2->3->4->5

总结

通过双指针的方法,我们可以高效地合并两个无序链表。这种方法的时间复杂度为O(n+m),其中n和m分别为两个链表的长度。通过使用golang的指针,我们可以轻松地移动节点,并且不需要额外的内存空间。因此,这是一种优秀的解决方案。

希望本文对于正在学习或使用golang开发的开发者有所帮助!

相关推荐