合并k个排序链表

题目

合并k个排序链表,并且返回合并后的排序链表。尝试分析和描述其复杂度。

样例

给出3个排序链表[2->4->null,null,-1->null],返回 -1->2->4->null

解题

两两合并

合并ab得到c

合并cd得到e

/**
 * Definition for ListNode.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int val) {
 *         this.val = val;
 *         this.next = null;
 *     }
 * }
 */
public class Solution {
    /**
     * @param lists: a list of ListNode
     * @return: The head of one sorted list.
     */
    public ListNode mergeKLists(List<ListNode> lists) {
        // write your code here
        if(lists == null || lists.size()==0)
            return null;
        ListNode head = lists.get(0);
        for(int i=1;i<lists.size();i++){
            ListNode list = lists.get(i);
            if(list!=null)
                head = merge(head,list);
        }
        // print(head);
        return head;
    }
    public void print(ListNode head){
        while(head!=null){
            System.out.print(head.val + "->");
            head = head.next;
        }
        System.out.println();
    }
    public ListNode merge(ListNode l1,ListNode l2){
        if(l1==null)
            return l2;
        if(l2==null)
            return l1;
        ListNode head = new ListNode(-1);
        ListNode cur = head;
        while(l1!=null && l2!=null){
            if(l1.val <=l2.val){
                cur.next = l1;
                l1 = l1.next;
            }else{
                cur.next = l2;
                l2 = l2.next;
            }
            cur = cur.next;
        }
        if(l1!=null)
            cur.next = l1;
        if(l2!=null)
            cur.next = l2;
        return head.next;
    }
}

利用优先队列

    public ListNode mergeKLists(List<ListNode> lists) {
        // write your code here
        if(lists == null || lists.size()==0)
            return null;
        ListNode head = new ListNode(0);
        PriorityQueue<ListNode> q = new PriorityQueue<ListNode>(lists.size(),new Comparator<ListNode>(){
            public int compare(ListNode a ,ListNode b){
                if(a.val > b.val)
                    return 1;
                else if(a.val == b.val)
                    return 0;
                return -1;
            }
        });
        for(ListNode list:lists){
            if(list!=null)
                q.add(list);
        }
        ListNode p = head;
        while(q.size() >0){
            ListNode tmp = q.poll();
            p.next = tmp;
            if(tmp.next!=null){
                q.add(tmp.next);
            }
            p = p.next;
        }
        return head.next;
    }
时间: 2024-10-01 19:28:20

合并k个排序链表的相关文章

[leetcode] 23. 合并K个排序链表

23. 合并K个排序链表 这个题算是考察代码功底吧,基本功,对变量与引用的理解. 不多说了,思路跟第21题基本一致,只不过从两个换成了多个 class Solution { public ListNode mergeKLists(ListNode[] lists) { List<ListNode> listNodes = new ArrayList<>(Arrays.asList(lists)); ListNode ans = new ListNode(Integer.MAX_VA

23. 合并K个排序链表

知乎ID: 码蹄疾 码蹄疾,毕业于哈尔滨工业大学. 小米广告第三代广告引擎的设计者.开发者: 负责小米应用商店.日历.开屏广告业务线研发:主导小米广告引擎多个模块重构: 关注推荐.搜索.广告领域相关知识; 题目 合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度.示例:输入:[ 1->4->5, 1->3->4, 2->6]输出: 1->1->2->3->4->4->5->6 分析 前面已经做过两个有序链表的合并,只

LeetCode 第23题 合并K个排序链表

/* 23. 合并K个排序链表 合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入:[ 1->4->5, 1->3->4, 2->6]输出: 1->1->2->3->4->4->5->6 */ /** * Definition for singly-linked list. public class ListNode { int val; ListNode next; ListNode(int * x

LeetCode 23. 合并K个排序链表(Merge Two Sorted Lists)

23. 合并K个排序链表 23. Merge k Sorted Lists 题目描述 合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. LeetCode23. Merge k Sorted Lists困难 示例: 输入: [ ??1->4->5, ??1->3->4, ??2->6] 输出: 1->1->2->3->4->4->5->6 Java 实现 public class ListNode { int va

[LeetCode]23. 合并K个排序链表(优先队列;分治待做)

题目 合并?k?个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入: [ ? 1->4->5, ? 1->3->4, ? 2->6] 输出: 1->1->2->3->4->4->5->6 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/merge-k-sorted-lists 著作权归领扣网络所有.商业转载请联系官方授权,非商业转载请注明出处. 题解 方法

leetcode(14)-合并k个排序链表

合并?k?个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: #输入: [ ? 1->4->5, ? 1->3->4, ? 2->6 ] #输出: 1->1->2->3->4->4->5->6 链接:https://leetcode-cn.com/problems/merge-k-sorted-lists 自己的思路 在k个链表中找到一个比较节点,然后把k个链表分成两部分,一部分都比比较节点小,一部分都比比较节点大,

Java实现 亚博体育LeetCode 23 合并K个排序链表

合并K个排序链表 合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入:[1->4->5,1->3->4,2->6]输出: 1->1->2->3->4->4->5->6 PS:直接用PriorityQueue自动排序,改写一下compare方法. /** Definition for singly-linked list. public class ListNode { int val; ListNod

leetCode 23. Merge k Sorted Lists (合并k个排序链表) 解题思路和方法

Merge k Sorted Lists Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 思路:此题是由合并两个排序链表演化而来,刚开始,想法比较简单,像求最大公共前缀一样,逐一求解:但是最后超时,所以马上意识到出题方是为了使用归并和分治的方法,故重新写了代码. 代码一(超时未过): /** * Definition for singly-link

每天AC系列(九):合并K个排序链表

1 题目 LeetCode第23题,合并k个有序的链表. 2 暴力法 直接遍历所有链表,取出所有节点的值,用数组存储,非降序排序,然后创建一个新链表用头插法依次插入节点. List<Integer> s = new ArrayList<>(); for(ListNode x:lists) { while(x != null) { s.add(x.val); x = x.next; } } s.sort((a,b) -> {return a.compareTo(b);}); L