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)。

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

相关文章
|
1月前
|
算法
LeetCode第66题加一
LeetCode第66题"加一"的解题方法,通过遍历数组从后向前处理每一位的加法,并考虑进位情况,最终实现给定数字加一的功能。
LeetCode第66题加一
|
4月前
leetcode-475:供暖器
leetcode-475:供暖器
37 0
|
4月前
|
Java
leetcode-474:一和零
leetcode-474:一和零
32 0
|
存储
leetcode:53.最大字序和
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
45 0
leetcode 827 最大人工岛
leetcode 827 最大人工岛
56 0
leetcode 827 最大人工岛
leetcode 283 移动零
leetcode 283 移动零
50 0
leetcode第55题
当自己按照 45 题的思路写完的时候,看 Solution 的时候都懵逼了,这道题竟然这么复杂?不过 Solution 把问题抽象成动态规划的思想,以及优化的过程还是非常值得学习的。
leetcode第55题
leetcode第39题
对回溯法又有了更深的了解,一般的架构就是一个大的 for 循环,然后先 add,接着利用递归进行向前遍历,然后再 remove ,继续循环。而解法二的动态规划就是一定要找到递进的规则,开始的时候就想偏了,导致迟迟想不出来。
leetcode第39题
leetcode第46题
这是自己开始想到的一个方法,考虑的思路是,先考虑小问题怎么解决,然后再利用小问题去解决大问题。没错,就是递归的思路。比如说, 如果只有 1 个数字 [ 1 ],那么很简单,直接返回 [ [ 1 ] ] 就 OK 了。 如果加了 1 个数字 2, [ 1 2 ] 该怎么办呢?我们只需要在上边的情况里,在 1 的空隙,也就是左边右边插入 2 就够了。变成 [ [ 2 1 ], [ 1 2 ] ]。
leetcode第46题
|
存储
leetcode第52题
可以发现对于同一条副对角线,row + col 的值是相等的。 对于同一条主对角线,row - col 的值是相等的。 我们同样可以用一个 bool 型数组,来保存当前对角线是否有元素,把它们相加相减的值作为下标。 对于 row - col ,由于出现了负数,所以可以加 1 个 n,由 [ - 3, 3 ] 转换为 [ 1 , 7 ] 。
leetcode第52题