有一次,在LeetCode上做了一道题——从尾到头打印链表。打印链表?这有什么难的,我直接一顿操作,代码如下
public int[] reversePrint(ListNode head) {
LinkedList<Integer> list = new LinkedList();
while(head != null){
list.addFirst(head.val);
head = head.next;
}
return list.stream().mapToInt(Integer::valueOf).toArray();
}
一提交,结果。。。
于是我换了一种写法,代码如下
public int[] reversePrint(ListNode head) {
int len = 0, i = 0;
ListNode p = head;
while(p != null){
len++;
p = p.next;
}
int[] res = new int[len];
while(head != null){
res[len - i - 1] = head.val;
i++;
head = head.next;
}
return res;
}
这不就好起来了。但原因是因为什么呢?是LinkedList呢?还是Stream?
初步推断是因为LinkedList,由于LinkedList内部是链表,每次添加一个元素时,都需要创建一个对象,频繁的创建对象,需要频繁的分配内存,耗费了大量的时间,而在第二个写法中,只需分配一次内存,所以速度提高很多。