合并k个升序链表

该博客介绍了如何将多个已排序的链表合并成一个有序链表。通过使用优先队列(小顶堆),将每个链表的头节点依次入队,并在每次出队时连接相邻节点,最终得到合并后的有序链表。示例展示了不同输入情况下的合并结果,提示中强调了链表长度和元素范围。该问题涉及堆和链表操作,属于数据结构和算法的范畴。
摘要由CSDN通过智能技术生成

//给你一个链表数组,每个链表都已经按升序排列。
//
// 请你将所有链表合并到一个升序链表中,返回合并后的链表。
//
//
//
// 示例 1:
//
// 输入: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
//
//
// 示例 2:
//
// 输入:lists = []
//输出:[]
//
//
// 示例 3:
//
// 输入:lists = [[]]
//输出:[]
//
//
//
//
// 提示:
//
//
// k == lists.length
// 0 <= k <= 10^4
// 0 <= lists[i].length <= 500
// -10^4 <= lists[i][j] <= 10^4
// lists[i] 按 升序 排列
// lists[i].length 的总和不超过 10^4
//
// Related Topics 堆 链表 分治算法
// 👍 1053 👎 0

//leetcode submit region begin(Prohibit modification and deletion)

import java.util.Comparator;
import java.util.PriorityQueue;

/**

  • Definition for singly-linked list.
  • public class ListNode {
  • int val;
    
  • ListNode next;
    
  • ListNode() {}
    
  • ListNode(int val) { this.val = val; }
    
  • ListNode(int val, ListNode next) { this.val = val; this.next = next; }
    
  • }
    */

解题思路

1.把每个链表的头加入堆中。使用PriporityQueue,默认使小顶堆。他会帮你把序排好。

2.弹出,此时找到头结点,然后来到弹出结点的下一个结点。

3。加入堆中,依次循环,知道堆中数据为空。合并结束。

class Solution {
    public ListNode mergeKLists(ListNode[] lists) {
        PriorityQueue<ListNode> queue=new PriorityQueue<ListNode>(new Comparator<ListNode>() {
            @Override
            public int compare(ListNode o1, ListNode o2) {
                return o1.val-o2.val;
            }
        });

        for(int i=0;i<lists.length;i++){
            if(lists[i]!=null){
                queue.add(lists[i]);
            }
        }

        if(queue.isEmpty())  return null;
        ListNode head=queue.poll();
        ListNode pre=head;

        if(pre.next!=null){
            queue.add(pre.next);
        }

        while(!queue.isEmpty()){
            ListNode cur=queue.poll();
            pre.next=cur;
            pre=cur;
            if(cur.next!=null){
                queue.add(cur.next);
            }
        }


        return head;

    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值