LeetCode.H23
题目:
题目大意:
按升序合并k个升序链表。
数据范围:
如图所示
一 、解法一 :
思路:
按照合并两个有序链表的方法,依次合并第x个链表。
代码:
import java.util.List;
import java.util.PriorityQueue;
import java.util.Queue;
class ListNode {
int val;
ListNode next;
ListNode() {}
ListNode(int val) { this.val = val; }
ListNode(int val, ListNode next) { this.val = val; this.next = next; }
}
class Solution {
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
ListNode head = new ListNode(), p = head;
while (list1 != null && list2 != null){
if (list1.val < list2.val){
p.next = list1;
p = p.next;
list1 = list1.next;
}else {
p.next = list2;
p = p.next;
list2 = list2.next;
}
}
if (list1 != null)
p.next = list1;
if (list2 != null)
p.next = list2;
return head.next;
}
public ListNode mergeKLists(ListNode[] lists) {
ListNode listNode = new ListNode((int)-1e9);
for (int i = 0; i < lists.length; i ++ ){
listNode = mergeTwoLists(listNode, lists[i]);
}
return listNode.next;
}
}
public class Main {
public static void main(String[] args) {
Solution solution = new Solution();
ListNode[] listNodes = new ListNode[5];
ListNode node1 = new ListNode(1);
ListNode node2 = new ListNode(4);
ListNode node3 = new ListNode(5);
node1.next = node2;
node2.next = node3;
ListNode node4 = new ListNode(1);
ListNode node5 = new ListNode(3);
ListNode node6 = new ListNode(4);
node4.next = node5;
node5.next = node6;
ListNode node7 = new ListNode(2);
ListNode node8 = new ListNode(6);
// ListNode node9 = new ListNode(4);
node7.next = node8;
// node8.next = node9;
listNodes[0] = node1;
listNodes[1] = node4;
listNodes[2] = node7;
ListNode head = solution.mergeKLists(listNodes);
while (head != null){
System.out.print(head.val + ", ");
head = head.next;
}
System.out.println();
}
}
时空复杂度分析等:
- 时间复杂度 : O(K^2*n)
- 空间复杂度 : O(1)
二 、解法二 :
思路:
使用优先队列,维护这几个链表头部的最小的一个节点。
代码:
class Solution {
class Status implements Comparable<Status>{
int val;
ListNode node;
public Status(int val, ListNode node) {
this.val = val;
this.node = node;
}
@Override
public int compareTo(Status o) {
return val - o.val;
}
}
public ListNode mergeKLists(ListNode[] lists) {
ListNode listHead = new ListNode((int)-1e9);
ListNode tail = listHead;
Queue<Status> queue = new PriorityQueue<>();
for (ListNode node : lists){
if (node != null)
queue.add(new Status(node.val, node));
}
while (!queue.isEmpty()){
Status status = queue.poll();
ListNode node = status.node;
tail.next = node;
tail = tail.next;
if (node.next != null){
queue.add(new Status(node.next.val, node.next));
}
}
return listHead.next;
}
}
时空复杂度分析等:
-
时间复杂度 : O(kn * logk)
-
空间复杂度 : O(k)