问题
给你一个链表数组,每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表中,返回合并后的链表。
思路
public class ListNode {
private int val;
private ListNode next;
public ListNode mergeKLists(ListNode[] lists) {
Queue<Node> queue = new PriorityQueue<Node>();
for (ListNode list : lists) {
if (list != null) {
queue.add(new Node(list.val, list));
}
}
ListNode head = new ListNode();
ListNode tail = head;
while (!queue.isEmpty()) {
Node min = queue.poll();
tail.next = min.node;
tail = tail.next;
if (min.node.next != null) {
queue.add(new Node(min.node.next.val, min.node.next));
}
}
return head.next;
}
class Node implements Comparable<Node> {
private int val;
private ListNode node;
public Node(int val, ListNode node) {
this.val = val;
this.node = node;
}
public int compareTo(Node o) {
return this.val - o.val;
}
}
}
update 20210317
public ListNode mergeKLists(ListNode[] lists) {
Queue<ListNode> queue = new PriorityQueue<>(new Comparator<ListNode>() {
@Override
public int compare(ListNode o1, ListNode o2) {
return o1.val - o2.val;
}
});
for (ListNode node : lists) {
if (node != null) {
queue.add(node);
}
}
ListNode head = null;
ListNode p = null;
while (!queue.isEmpty()) {
ListNode node = queue.poll();
if (head == null) {
head = node;
} else {
p.next = node;
}
p = node;
if (node.next != null) {
queue.add(node.next);
}
}
return head;
}
update20220412
public ListNode mergeKLists(ListNode[] lists) {
if (lists == null || lists.length == 0) {
return null;
}
ListNode dummyHead = new ListNode();
ListNode p = dummyHead;
Queue<ListNode> queue = new PriorityQueue<>((n1, n2) -> n1.val - n2.val);
for (ListNode list : lists) {
if (list != null) {
queue.offer(list);
}
}
while (!queue.isEmpty()) {
ListNode temp = queue.poll();
p.next = temp;
p = temp;
if (temp.next != null) {
queue.offer(temp.next);
}
}
return dummyHead.next;
}
update20230419
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
ListNode head = new ListNode(0, null);
int size = lists.length;
Queue<ListNode> queue = new PriorityQueue<ListNode>((o1, o2) -> o1.val - o2.val);
for (int i = 0; i < size; i++) {
if (lists[i] != null) {
queue.offer(lists[i]);
}
}
ListNode p = head;
while (!queue.isEmpty()) {
ListNode node = queue.poll();
if (node.next != null) {
queue.offer(node.next);
}
p.next = node;
p = p.next;
}
return head.next;
}
}
复杂度
时间复杂度:k*n*logk。k是指链表数组的个数。n是指每个链表的长度k*n表示每个节点都要被遍历一次。logk表示优先队列增加、删除节点后调整的时间复杂度。
空间复杂度:k。优先队列中元素的个数。
硬广告
欢迎关注公众号:double6
final
本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情