014_合并K个排序链表

知识点:递归、分治、优先队列(堆)

LeetCode第二十三题:https://leetcode-cn.com/problems/merge-k-sorted-lists/submissions/

分治与优先队列都能实现logk的效果,这里只实现了分治的解法,没有用优先队列(Go中搞到优先队列数据结构有点麻烦,还是Java和Python友好)。

语言:GoLang

 // 朴素解法:递归
func mergeKLists_(lists []*ListNode) *ListNode {
    tmpMin, tmpIndex := math.MaxInt32, -1

    for i := 0; i < len(lists); i++ {
        if lists[i] == nil {
            continue
        }

        if lists[i].Val < tmpMin {
            tmpMin = lists[i].Val
            tmpIndex = i
        }
    }

    if tmpIndex == -1 {
        return nil
    }

    head := lists[tmpIndex]
    lists[tmpIndex] = lists[tmpIndex].Next

    head.Next = mergeKLists(lists)

    return head
}

// 分治
func mergeKLists(lists []*ListNode) *ListNode {
	length := len(lists)

	if length == 0 {
		return nil
	}

	if length == 1 {
		return lists[0]
	}

	return mergeTwoLists(mergeKLists(lists[ : length / 2]), mergeKLists(lists[length / 2 : ]))
}

func mergeTwoLists(l1 *ListNode, l2 *ListNode) *ListNode {
    if l1 == nil {
        return l2
    }
    if l2 == nil {
        return l1
    }

    if l1.Val > l2.Val {
        l2.Next = mergeTwoLists(l1, l2.Next)
        return l2
    }else {
        l1.Next = mergeTwoLists(l1.Next, l2)
        return l1
    }
}
posted @ 2020-03-09 20:01  Cenyol  阅读(109)  评论(0)    收藏  举报