问题描述
问题分析
分析题目,这是使用链表实现对整数相加的简单模拟。需要注意的地方是:我们可以给新链表添加头结点,来避免写一些额外的代码来定义表头结点的值。
- 时间复杂度:O( max(m, n) ),其中m和n 分别表示l1和l2的长度。l1和l2的指针同时步进,直到两个链表中较长的链表也遍历完。
- 空间复杂度:O( max(m, n) ), 新列表的长度最多为max(m,n)+1。
Java代码
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode head = new ListNode(0);
ListNode p = head;
int over = 0;
int x, y, sum;
while (l1 != null || l2 != null) {
x = (l1 != null) ? l1.val : 0;
y = (l2 != null) ? l2.val : 0;
sum = over + x + y;
over = sum / 10;
p.next = new ListNode(sum % 10);
p = p.next;
if (l1 != null) l1 = l1.next;
if (l2 != null) l2 = l2.next;
}
if (over > 0) {
p.next = new ListNode(over);
}
return head.next;
}
}
结果分析
以上代码的执行结果:
执行时间 | 内存消耗 |
---|---|
10ms | 44.9MB |
我尝试优化while (l1 != null || l2 != null) 为while (l1 != null && l2 != null) ,对于走完较短链表后,较长链表的剩余部分加入处理代码,以减少以下代码多余的比较次数:
if (l1 != null) l1 = l1.next;
if (l2 != null) l2 = l2.next;
结果表明,这两句代码比较所花费的时间在总耗时中占比很小,并不会引起明显的时间变化。并且由于加入了近30行的处理代码,增加了程序编译时间和所占的内存,反而降低了性能。
执行时间 | 内存消耗 |
---|---|
11ms | 46.5MB |
这让我明白,在判断语句并不复杂的情况下,我们可以进行适度的冗余判断,以精简代码而得到较好的性能。