《零基础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