zoukankan      html  css  js  c++  java
  • K个升序链表合并 (每日一题)

    给你一个链表数组,每个链表都已经按升序排列。

    请你将所有链表合并到一个升序链表中,返回合并后的链表。

    示例 :

    输入:lists = [[1,4,5],[1,3,4],[2,6]]
    输出:[1,1,2,3,4,4,5,6]
    解释:链表数组如下:
    [
    1->4->5,
    1->3->4,
    2->6
    ]
    将它们合并到一个有序链表中得到。
    1->1->2->3->4->4->5->6

    解决思路:首先想到的是在两个有序链表合并的基础上进行改进,于是乎,第一版代码出炉:

    /**
     * Definition for singly-linked list.
     * type ListNode struct {
     *     Val int
     *     Next *ListNode
     * }
     */
    func mergeKLists(lists []*ListNode) *ListNode {
        if len(lists)==0{
            return nil
        }
        if len(lists) == 1{
            return lists[0]
        }
        if len(lists) == 2{
            return mergeTwoLists(lists[0],lists[1])
        }
        mid := len(lists)/2
        lists1 := lists[:mid]
        lists2 := lists[mid:]
        return mergeTwoLists(mergeKLists(lists1),mergeKLists(lists2))
    }
    func mergeTwoLists(l1,l2 *ListNode) *ListNode{
        if l1==nil{return l2}
        if l2==nil{return l1}
        pre := &ListNode{Val:0,Next:nil}
        cur := pre
            if l1.Val>l2.Val{
                cur.Next = l2
                cur.Next.Next = mergeTwoLists(l2.Next,l1)
            }else{
                cur.Next = l1
                cur.Next.Next = mergeTwoLists(l1.Next,l2)
            }
        return pre.Next
    }
    

     想一下,这个算法的时间复杂度是多少呢?O(NlogN),

    改进一波:

    使用堆来进行优化

  • 相关阅读:
    451. Sort Characters By Frequency
    424. Longest Repeating Character Replacement
    68. Text Justification
    44. Wildcard Matching
    160. Intersection of Two Linked Lists
    24. Swap Nodes in Pairs
    93. 递归实现组合型枚举
    98. 分形之城
    97. 约数之和
    96. 奇怪的汉诺塔
  • 原文地址:https://www.cnblogs.com/lvpengbo/p/14243705.html
Copyright © 2011-2022 走看看