多少人可以在一小时内做出来,面试题插入排序单链表

2019 年 6 月 10 日
 greenlake
让你用你熟悉的语言写一个插入排序单链表的算法题,你可以在一小时内写出来吗,并配上单元测试,同时编译通过
6967 次点击
所在节点    程序员
44 条回复
zchlwj
2019 年 6 月 11 日
easy 难度。多做做 leetcode
TomVista
2019 年 6 月 11 日
2 本毕业一年,得重新学.
petelin
2019 年 6 月 11 日
应该只能用冒泡排序吧
BBCCBB
2019 年 6 月 11 日
这个用归并排序, leetcode 就有.插入排序也简单..
shilyx
2019 年 6 月 11 日
半小时
shilyx
2019 年 6 月 11 日
misaka19000
2019 年 6 月 11 日
这个算是非常基础的题目了吧,感觉应该要不了一个小时就够了
Finest
2019 年 6 月 11 日
用 python 的话,就 10 分钟吧
misaka19000
2019 年 6 月 11 日
@xuanbg #7 写的话应该基本上都写过吧,不过在生产环境肯定是不会用自己实现的链表的
cjh1095358798
2019 年 6 月 11 日
三点:1.快速指针找到中点 2.归并 3,合并两条有序链表
Caballarii
2019 年 6 月 11 日
一个小时,即使你完全没接触过快速排序,拿到算法也应该能自己实现出来了
tt67wq
2019 年 6 月 11 日
如果插入的话,没啥难度,归并难点
jorneyr
2019 年 6 月 11 日
链表使用一个空的头结点可以简化插入删除操作

插入排序时转变一下思路即可:
数组的插入:前面都是有序的
链表的插入:后面都是有序的
trn4
2019 年 6 月 11 日
@cjh1095358798 那是归并排序……
whusnoopy
2019 年 6 月 11 日
这种题在 BAT 这个级别的公司里,应该是技术面第一轮暖身题的难度,最低期望应该是 20 分钟内解决。依次对比可以估算下应该多少人会写

P.S. 当年毕业时某一轮现场面在纸上写了一个完整的 AVL 平衡二叉树,写了 4 页 A4 纸,还跟面试官逐步去纸上调试了一遍,包括各种边界情况
pwrliang
2019 年 6 月 11 日
@greenlake 一到公司就迫不及待,花了有半小时吧,写出来了。包含一个编码、测试,用了 Idea 做调试,直接白板写估计够呛。

-------------------
```
import java.util.*;

class Solution {
class Node {
Node next;
int val;

Node() {

}

Node(int val) {
this.val = val;
}

@Override
public String toString() {
return val + (next != null ? "->" + next.toString() : "");
}
}

boolean check(Node head) {
Node p = head.next;

while (p.next != null) {
if (p.val > p.next.val) {
return false;
}
p = p.next;
}

return true;
}

Node asNode(int[] array) {
Node head = new Node();
Node p = head;

for (int e : array) {
p.next = new Node(e);
p = p.next;
}

return head;
}

void sort(Node head) {
if (head == null || head.next == null)
return;

Node prev = head;
Node curr = prev.next;

while (prev.next != null) {
Node p = head;
boolean changed = false;
while (p != curr) {
if (p == head && curr.val < p.next.val || curr.val >= p.val && curr.val < p.next.val) {
prev.next = curr.next;
Node tmp = p.next;
p.next = curr;
curr.next = tmp;
changed = true;
break;
}
p = p.next;
}

if (changed) {
curr = prev.next;
} else {
prev = prev.next;
curr = prev.next;
}
}
}
}


测试:

Solution solution = new Solution();
{
Solution.Node head = solution.asNode(new int[]{5, 1, 5, 3, 4, 2});
solution.sort(head);
assert solution.check(head);
}

{
Solution.Node head = solution.asNode(new int[]{1});
solution.sort(head);
assert solution.check(head);
}

for (int times = 0; times < 1000; times++) {
int len = 2000;
int[] test = new int[len];
Random random = new Random();
for (int i = 0; i < len; i++)
test[i] = random.nextInt();

Solution.Node head = solution.asNode(test);
solution.sort(head);
assert solution.check(head);
}

```
layorlayor
2019 年 6 月 11 日
这个不就是链表的遍历+节点插入吗
jmc891205
2019 年 6 月 11 日
工作中经常用链表的表示无压力
129ykx733D016U2n
2019 年 6 月 11 日
啥叫插入排序链表?是必须用插入排序,去排一个链表?
04BxPLXu2M6UKH6Z
2019 年 6 月 11 日
@whusnoopy 很凶残,但还是没有手写红黑树凶残哈哈哈哈哈哈哈,旋转真的要写到蛋碎

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://study.congcong.us/t/572589

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX