leetcode第23题

简介: 时间复杂度:假设 N 是所有的数字个数,存到数组是 O(N),排序如果是用快速排序就是 O(Nlog_N)O(NlogN) ,存到链表是 O(N),所以取个最大的,就是 O(Nlog_N)O(NlogN)。空间复杂度:新建了一个链表,O(N)。

image.png

k 个有序链表的合并。

我们用 N 表示链表的总长度,考虑最坏情况,k 个链表的长度相等,都为 n 。

解法一 暴力破解

简单粗暴,遍历所有的链表,将数字存到一个数组里,然后用快速排序,最后再将排序好的数组存到一个链表里。

publicListNodemergeKLists(ListNode[] lists) {
List<Integer>l=newArrayList<Integer>();
//存到数组for (ListNodeln : lists) {
while (ln!=null) {
l.add(ln.val);
ln=ln.next;
        }
    }
//数组排序Collections.sort(l);
//存到链表ListNodehead=newListNode(0);
ListNodeh=head;
for (inti : l) {
ListNodet=newListNode(i);
h.next=t;
h=h.next;
    }
h.next=null;
returnhead.next;
}

时间复杂度:假设 N 是所有的数字个数,存到数组是 O(N),排序如果是用快速排序就是 O(Nlog_N)O(NlogN) ,存到链表是 O(N),所以取个最大的,就是 O(Nlog_N)O(NlogN)

空间复杂度:新建了一个链表,O(N)。

解法二 一列一列比较

image.png


我们可以一列一列的比较,将最小的一个存到一个新的链表里。

publicListNodemergeKLists(ListNode[] lists) {
intmin_index=0;
ListNodehead=newListNode(0);
ListNodeh=head;
while (true) {
booleanisBreak=true;//标记是否遍历完所有链表intmin=Integer.MAX_VALUE;
for (inti=0; i<lists.length; i++) {
if (lists[i] !=null) {
//找出最小下标if (lists[i].val<min) {
min_index=i;
min=lists[i].val;
                }
//存在一个链表不为空,标记改完 falseisBreak=false;
            }
        }
if (isBreak) {
break;
        }
//加到新链表中ListNodea=newListNode(lists[min_index].val);
h.next=a;
h=h.next;
//链表后移一个元素lists[min_index] =lists[min_index].next;
    }
h.next=null;
returnhead.next;
}

时间复杂度:假设最长的链表长度是 n ,那么 while 循环将循环 n 次。假设链表列表里有 k 个链表,for 循环执行 k 次,所以时间复杂度是 O(kn)。

空间复杂度:N 表示最终链表的长度,则为 O(N)。

优先队列的运用印象深刻,此外对两两链表的合并,我们仅仅改变了合并的方式就将时间复杂度降低了很多,美妙!

相关文章
|
9月前
leetcode-472. 连接词
leetcode-472. 连接词
67 0
|
4月前
【LeetCode 02】暴力法总结
【LeetCode 02】暴力法总结
33 1
|
9月前
|
Java
leetcode-474:一和零
leetcode-474:一和零
49 0
|
算法 C++
每日算法系列【LeetCode 827】最大人工岛
每日算法系列【LeetCode 827】最大人工岛
142 0
|
算法 C++ Python
每日算法系列【LeetCode 881】救生艇
每日算法系列【LeetCode 881】救生艇
leetcode 827 最大人工岛
leetcode 827 最大人工岛
69 0
leetcode 827 最大人工岛
LeetCode 283. 移动零
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
96 0
|
存储 算法
leetcode第43题
个位乘个位,得出一个数,然后个位乘十位,全部乘完以后,就再用十位乘以各个位。然后百位乘以各个位,最后将每次得出的数相加。十位的结果要补 1 个 0 ,百位的结果要补两个 0 。相加的话我们可以直接用之前的大数相加。直接看代码吧。
102 0
leetcode第43题
|
存储
leetcode第56题
常规的思想,将大问题化解成小问题去解决。 假设给了一个大小为 n 的列表,然后我们假设 n - 1 个元素的列表已经完成了全部合并,我们现在要解决的就是剩下的 1 个,怎么加到已经合并完的 n -1 个元素中。 这样的话分下边几种情况, 我们把每个范围叫做一个节点,节点包括左端点和右端点。 1. 如下图,新加入的节点左端点和右端点,分别在两个节点之间。这样,我们只要删除
120 0
leetcode第56题