当前位置: 首页 > article >正文

《零基础Go语言算法实战》【题目 4-7】实现链表的排序

《零基础Go语言算法实战》

【题目 4-7】实现链表的排序

请用 Go 语言实现合并 K 个排序的链表并将其作为一个排序链表返回。

【解答】

① 思路。

借助分治算法的思想,递归对比两个链表中的每个元素的值的大小,然后将 K 个有序链

表两两合并即可。

② Go 语言实现。

package main

import "fmt"

// 定义单链表

type ListNode struct {

 Data int

 Next *ListNode

}

// 合并 K 个链表

func mergeKLists(lists []*ListNode) *ListNode {

 length := len(lists)

 if length < 1 {

 return nil

 }

 if length == 1 {

 return lists[0]

 }

 num := length / 2

 left := mergeKLists(lists[:num])

 right := mergeKLists(lists[num:])

 return mergeTwoLists(left, right)

}

// 合并两个链表

func mergeTwoLists(l1 *ListNode, l2 *ListNode) *ListNode {

 if l1 == nil {

 return l2

 }

 if l2 == nil {

 return l1

 }

 if l1.Data < l2.Data {

 l1.Next = mergeTwoLists(l1.Next, l2)

 return l1

 }

 l2.Next = mergeTwoLists(l1, l2.Next)

 return l2

}

func main() {

 nodeList1 := ListNode{66, nil}

 nodeList2 := ListNode{99, nil}

 nodeList3 := ListNode{88, nil}

 nodeList4 := ListNode{55, nil}

 ListsK := []*ListNode{&nodeList1, &nodeList2, &nodeList3, &nodeList4}

 ret := mergeKLists(ListsK)

 // 打印结果

 fmt.Println(ret.Data)

 if ret.Next != nil {

 fmt.Println(ret.Next.Data)

 if ret.Next.Next != nil {

 fmt.Println(ret.Next.Next.Data)

 if ret.Next.Next.Next != nil {

 fmt.Println(ret.Next.Next.Next.Data)

 }

 }

 }

}

//$ go run interview4-7.go

//55

//66

//88

//99


http://www.kler.cn/a/505203.html

相关文章:

  • C++|CRC校验总结
  • 使用yarn命令创建Vue3项目
  • 【CSS】HTML页面定位CSS - position 属性 relative 、absolute、fixed 、sticky
  • 【HarmonyOS之旅】基于ArkTS开发(二) -> UI开发二
  • 深入Android架构(从线程到AIDL)_30 JNI架构原理_Java与C的对接03
  • 栈 (算法十二)
  • ukui-quick 计数器
  • 框架集成Minio(内含Minio工具类以及mc突破七天限制)
  • 如何为Python程序单独创建虚拟运行环境(Win/Mac/Linux)
  • GPT-4o背后的语音技术
  • 校园跑腿小程序--我的,登录和注册页面开发
  • Springboot集成Easy Rules引擎,实现一个商品优惠券系统
  • 数据结构(Java版)第九期:LinkedList与链表
  • 《Java核心技术II》实现服务器
  • vue3 父组件调用子组件方法
  • 在 WSL Ubuntu 上安装 ProxySQL 并配置 主从同步,读写分离,延迟检测
  • C++并发编程之掩藏任务延迟与提高响应性的应用说明
  • Windows MFC 管理员权限DragAcceptFiles无效 处理方法
  • JavaSwing游戏开发之Camera原理
  • Java 输入输出流(上)
  • Gitlab流水线配置
  • Java 后端整合 Swagger + Knife4j 接口文档
  • 学员答疑:安卓分屏窗口的TouchableRegion设置流程追踪
  • 【STM32】存储分析深入——堆栈与map文件
  • C++进阶(四)--set和map的介绍与使用
  • 【落羽的落羽 C语言篇】文件操作