题目简析

两个数存储在链表中,倒序排列的,分别相加,返回一个链表

算法详情:Add Two Numbers

这道题的考察有两点:

  • 链表指针的处理
  • 两数相加进位的处理

我的实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
if(l1==null&&l2==null){
return l1;
}

if(l1==null){
return l2;
}
if(l2==null){
return l1;
}
int rest=0;
ListNode result=null;
boolean firstNode=false;
ListNode resultHeader=null;
ListNode resultPointer=null;
int value=0;
while(l1!=null&&l2!=null){
value=l1.val+l2.val+rest;
rest=value>9?1:0;
value=value%10;
result=new ListNode(value);
if(!firstNode){
resultHeader=result;
resultPointer=resultHeader;
firstNode=true;
}else{
resultPointer.next=result;
resultPointer=result;
}
l1=l1.next;
l2=l2.next;
}
if(l1!=null||l2!=null){
if(l2==null){
while(l1!=null){
result=new ListNode(0);
value=l1.val+rest;
rest=value>9?1:0;
value=value%10;
l1=l1.next;
result.val=value;
resultPointer.next=result;
resultPointer=result;
}
}else{
while(l2!=null){
result=new ListNode(0);
value=l2.val+rest;
rest=value>9?1:0;
value=value%10;
l2=l2.next;
result.val=value;
resultPointer.next=result;
resultPointer=result;
}
}

}
if(rest!=0){
result=new ListNode(rest);
resultPointer.next=result;
}

return resultHeader;
}
}

参考答案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode dummyHead = new ListNode(0);
ListNode p = l1, q = l2, curr = dummyHead;
int carry = 0;
while (p != null || q != null) {
int x = (p != null) ? p.val : 0;
int y = (q != null) ? q.val : 0;
int sum = carry + x + y;
carry = sum / 10;
curr.next = new ListNode(sum % 10);
curr = curr.next;
if (p != null) p = p.next;
if (q != null) q = q.next;
}
if (carry > 0) {
curr.next = new ListNode(carry);
}
return dummyHead.next;
}

分析

  • 解题思路差不多,但是处理细节上,参考答案处理上更好一些。
    • 链表长短不一致时,循环的处理,都放在一起处理,而我的分开处理了。导致代码有点冗余了
    • 参考答案,设置了一个空Node,返回数据时,返回这个Node的next即可。避免了我在循环内部设置变量,用来控制对头结点的处理。