合并 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) { val = x; }
* }
*/
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
if(lists.length<1)
return null;
ListNode dummyHead = new ListNode(-1);
ListNode pre = dummyHead;
while(true)
{
int p = -1;
int min=Integer.MAX_VALUE;
for(int i=0;i<lists.length;i++)
{
if(lists[i]!=null && lists[i].val < min)
{
p=i;
min = lists[i].val;
}
}
if(p==-1)
break;
pre.next = lists[p];
pre = pre.next;
lists[p] = lists[p].next;
}
return dummyHead.next;
}
}
下面是大佬beat100%的做法,上面的做法实在暴力,356ms,下面则8ms,所有建议不仅仅只学会一种方法
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
// public ListNode mergeKLists(ListNode[] lists) {
// }
public ListNode mergeKLists(ListNode[] listNodes) {
if (listNodes == null || listNodes.length == 0) {
return null;
}
int n = listNodes.length;
while (n > 1) {
int k = (n + 1) / 2;
for (int i = 0; i < n / 2; i++) {
listNodes[i] = mergeTwoLists(listNodes[i], listNodes[i + k]);
}
n = k;
}
return listNodes[0];
}
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if (l1 == null && l2 == null) {
return null;
}
if (l1 == null) {
return l2;
}
if (l2 == null) {
return l1;
}
ListNode listNode;
ListNode itr = new ListNode(Integer.MIN_VALUE);
listNode = itr;
while (l1 != null || l2 != null) {
if (l1 == null) {
itr.next = l2;
l2 = l2.next;
} else if (l2 == null) {
itr.next = l1;
l1 = l1.next;
} else {
if (l1.val < l2.val) {
itr.next = l1;
l1 = l1.next;
} else {
itr.next = l2;
l2 = l2.next;
}
}
itr = itr.next;
}
return listNode.next;
}
}