给你一个链表数组,每个链表按升序排序。k``lists
将所有链接列表合并为一个排序的链接列表并返回它。
示例 1:
Input: lists = [[1,4,5],[1,3,4],[2,6]]
Output: [1,1,2,3,4,4,5,6]
Explanation: The linked-lists are:
[
1->4->5,
1->3->4,
2->6
]
merging them into one sorted list:
1->1->2->3->4->4->5->6
示例 2:
Input: lists = []
Output: []
示例3:
Input: lists = [[]]
Output: []
约束:
k == lists.length0 <= k <= 1040 <= lists[i].length <= 500-104 <= lists[i][j] <= 104lists[i]按升序排序。lists[i].length``104首先我们想到要将k个有序链表合并成为一个有序链表,肯定会涉及到链表节点之间的比较。所以我们首先定义一个比较器用来比较链表节点之间的大小其次我们用到一个优先队列第一次先将每个链表的头节点放入优先队列中然后每次从这个优先队列中取出一个元素就判断这个节点的后面是否还存在节点如果存在节点就将它的下一个节点又放入到优先队列中,始终秉持“取出一个元素加入一个元素”,直到这个优先队列为空。并依次将取出的元素串联起来形成一个新的链表最后返回这个新链表的头部。
代码:
import java.util.Comparator;
import java.util.PriorityQueue;
/**
* 给一个链表数组,每个链表都是升序有序排列,请你将所有链表合并到一个有序的升序的链表中并返回合并后的链表
*/
public class MergeAscLists {
//1.首先定义一个节点类
public static class ListNode{
public int value;
public ListNode next;
public ListNode(int value) {
this.value = value;
}
}
//2.再自己定义一个比较器
public static class ListNodeComparator implements Comparator<ListNode>{
/**
* 重写比较的方法:
* 所有的比较方法如果返回的是负数那么第一个参数o1在前面第二个参数o2在后面
* 如果返回的是正数那么第二个参数o2在前面第一个参数o1的后面
* 如果返回的是0那么第一个参数和第二个参数相等
* @param o1
* @param o2
* @return
*/
@Override
public int compare(ListNode o1, ListNode o2) {
return o1.value - o2.value;
}
}
//3.合并多个有序链表,参数为一个节点数组每个节点表示一个链表的头节点代表一个链表
public static ListNode mergeLists(ListNode[] lists){
//3.1如果数组为空返回null
if (lists == null) {
return null;
}
//3.2定义一个优先队列(其实这个优先队列是一个小根堆)
PriorityQueue<ListNode> heap = new PriorityQueue<>(new ListNodeComparator());
//3.3首先我们先将每个链表的头节点放进这个优先队列heap
for (int i = 0; i < lists.length; i++) {
if (lists[i] != null){
heap.add(lists[i]);
}
}
//3.3.1如果这个优先队列heap为空则返回null
if(heap.isEmpty()){
return null;
}
//3.3.2定义一个变量为head,head指向优先队列取出的元素 也就是先弹出一个作为整体的头部 先抓住最后返回
ListNode head = heap.poll();
//3.3.3定义一个变量pre指向head
ListNode pre = head;
/*
4.判断pre后面还有没有节点(因为刚开始lists数组中每个元素代表的是每个链表的头节点
所以这个操作就是判断链表后面还有没有节点如果有就将它加入到优先队列中)
*/
if (pre.next != null){
heap.add(pre.next);
}
//5.依次从这个优先队列heap中取出元素,每弹出一个就挂在head的next指针上
while (!heap.isEmpty()){
//5.1弹出一个元素
ListNode cur = heap.poll();
//5.2将弹出的这个元素挂在head的next指针上因为pre指向head
pre.next = cur;
//5.3然后pre继续往下走 指向现在的cur
pre = cur;
//5.4如果当前的cur的next指针不为空就将它加入到优先队列heap中
if(cur.next != null){
heap.add(cur.next);
}
}
/*
总结:也就是出来一个进去一个出来一个进去一个直到这个优先队列为空的时候
*/
//6.最后返回第一次抓住的head这就是合并后的链表的头节点
return head;
}
}
是否有类似“RVMuse1”或“RVMuselist[0]”之类的内容而不是键入整个版本号。在任何时候,我们都会看到一个可能包含5个或更多ruby的列表,我们可以轻松地键入一个数字而不是X.X.X。这也有助于rvmgemset。 最佳答案 这在RVM2.0中是可能的=>https://docs.google.com/document/d/1xW9GeEpLOWPcddDg_hOPvK4oeLxJmU3Q5FiCNT7nTAc/edit?usp=sharing-知道链接的任何人都可以发表评论
我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat
给定一个复杂的对象层次结构,幸运的是它不包含循环引用,我如何实现支持各种格式的序列化?我不是来讨论实际实现的。相反,我正在寻找可能会派上用场的设计模式提示。更准确地说:我正在使用Ruby,我想解析XML和JSON数据以构建复杂的对象层次结构。此外,应该可以将该层次结构序列化为JSON、XML和可能的HTML。我可以为此使用Builder模式吗?在任何提到的情况下,我都有某种结构化数据-无论是在内存中还是文本中-我想用它来构建其他东西。我认为将序列化逻辑与实际业务逻辑分开会很好,这样我以后就可以轻松支持多种XML格式。 最佳答案 我最
文章目录git常用命令(简介,详细参数往下看)Git提交代码步骤gitpullgitstatusgitaddgitcommitgitpushgit代码冲突合并问题方法一:放弃本地代码方法二:合并代码常用命令以及详细参数gitadd将文件添加到仓库:gitdiff比较文件异同gitlog查看历史记录gitreset代码回滚版本库相关操作远程仓库相关操作分支相关操作创建分支查看分支:gitbranch合并分支:gitmerge删除分支:gitbranch-ddev查看分支合并图:gitlog–graph–pretty=oneline–abbrev-commit撤消某次提交git用户名密码相关配置g
有什么区别:@attr[:field]=new_value和@attr.merge(:field=>new_value) 最佳答案 如果您使用的是merge!而不是merge,则没有区别。唯一的区别是您可以在合并参数中使用多个字段(意思是:另一个散列)。例子:h1={"a"=>100,"b"=>200}h2={"b"=>254,"c"=>300}h3=h1.merge(h2)putsh1#=>{"a"=>100,"b"=>200}putsh3#=>{"a"=>100,"b"=>254,"c"=>300}h1.merge!(h2)pu
假设我必须(小型到中型)阵列:tokens=["aaa","ccc","xxx","bbb","ccc","yyy","zzz"]template=["aaa","bbb","ccc"]如何确定tokens是否以相同的顺序包含template的所有条目?(请注意,在上面的示例中,应忽略第一个“ccc”,从而由于最后一个“ccc”而导致匹配。) 最佳答案 这适用于您的示例数据。tokens=["aaa","ccc","xxx","bbb","ccc","yyy","zzz"]template=["aaa","bbb","ccc"]po
我正在使用Rails3.2.3和Ruby1.9.3p0。我发现我经常需要确定某个字符串是否出现在选项列表中。看来我可以使用Ruby数组.includemethod:或正则表达式equals-tildematchshorthand用竖线分隔选项:就性能而言,一个比另一个好吗?还有更好的方法吗? 最佳答案 总结:Array#include?包含String元素,在接受和拒绝输入时均胜出,对于您的示例只有三个可接受的值。对于要检查的更大的集合,看起来Set#include?和String元素可能会获胜。如何测试我们应该根据经验对此进行测试
首先,我使用的是rails3.1.3和来自master的carrierwavegithub仓库的分支。我使用after_init钩子(Hook)来确定基于属性的字段页面模型实例并为这些字段定义属性访问器将值存储在序列化哈希中(希望它清楚我是什么谈论)。这是我正在做的事情的精简版:classPage省略mount_uploader命令让我可以访问我想要的属性。但是当我安装uploader时出现错误消息说“nil类的未定义新方法”我在源代码中读到有方法read_uploader和扩展模块中的write_uploader。我如何必须覆盖这些来制作mount_uploader命令使用我的“虚拟
之前有人问过这个问题,我发现了以下clip关于如何一次设置一个类对象的所有属性,但由于批量分配保护,这在Rails中是不可能的。(例如,您不能Object.attributes={})有没有一种很好的方法可以将一个类的属性合并到另一个类中?object1.attributes=object2.attributes.inject({}){|h,(k,v)|h[k]=vifObjectModel.column_names.include?(k);h}谢谢。 最佳答案 利用assign_attributes使用:without_prote
这是我发现自己偶尔想做的事情。假设我有一个参数列表。在Lisp中,我可以像这样`(imaginary-function,@args)为了调用将数组从一个元素转换为正确数量的参数的函数。Ruby中是否有类似的功能?或者我只是在这里使用了一个完全错误的成语? 最佳答案 是的!它被称为splat运算符。a=[1,44]p(*a) 关于Ruby:如何将数组拼接成Lisp风格的列表?,我们在StackOverflow上找到一个类似的问题: https://stackov