![]() |
1
6
合并两个排序的列表在算法上是微不足道的。 从每个列表的第一个元素开始,比较,写下下要输出的较低的元素,并将找到较低的元素的列表向前推进。一直往前走,直到你到达一个列表的末尾,然后把另一个列表的其余部分放出来。 这只需要在每个列表上循环一次,并且每个输出元素最多需要一个比较。 编辑:这和两个列表一样有效。当你有大量的列表要合并时,它会变得(有点)更加棘手。 |
![]() |
2
6
你可以写一个函数
…你什么都没说。 |
![]() |
3
2
如果你只有两个,那就相对容易了。
可以使用一些助手参数(可能还有自定义的“reverse and cons to”助手函数)将其转换为尾部递归过程。 |
![]() |
4
1
有两种方法可以解决这个问题。 因为有两个链表,而且两个链表都是以最简单的方式在高级别排序的 忽略基本情况。
为了进一步优化这一点,我们可以对插入进行排序,以重新运行插入的位置。 每次都避免插入。因为在最坏的情况下,如果第二个链表元素都被插入到第一个链表的末尾,这可能需要O(m*n)的时间复杂性。 |
![]() |
5
0
您要查找的是创建列表的函数的递归定义(通过合并两个列表)。 可以预料,函数将根据某种原理提取head元素,然后从其余元素递归构造list tail,从而创建一个列表。 由于需要返回已排序的列表,因此列表头始终是列表中最小的元素。所以,您需要做的就是找到一个算法,从两个排序的列表中提取最小的元素(这应该很容易,因为它们是排序的)。 |
![]() |
6
0
如果你的列表可以加倍
balanced binary trees
,可以插入
|
![]() |
lightning_missile · 词法范围和共享对象 7 年前 |
![]() |
Alexandru Popa · SBCL中奇怪的宏扩展错误 7 年前 |
![]() |
Jacky · 编辑列表中的每个偶数索引元素 7 年前 |
![]() |
HappyFace · lisp典型缩进约定背后的规则是什么? 7 年前 |
![]() |
Jorge · 在公共Lisp中初始化计数器变量 7 年前 |
![]() |
Rorschach · cl循环破坏性修改cons单元 7 年前 |