很经典的一道题,有几个需要注意的地方。
- 使用c1和c2来遍历两个linked list;
- 创建了一个dummyHead来应对各种corner case;
- 定义一个carry变量,用来存放前一位相加带来的进位;
- while循环的退出条件是c1和c2都为null,并且可以用if语句来处理c1和c2二者有一个为null的情况;
- 新建node的时候使用sum % 10;
- 循环结束后还要检查是否存在进位的情况。
代码如下:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode c1 = l1;
ListNode c2 = l2;
ListNode dummy = new ListNode(0);
ListNode digit = dummy;
int carry = 0;
while(c1 != null || c2 != null){
int sum = carry;
if(c1 != null){
sum += c1.val;
c1 = c1.next;
}
if(c2 != null){
sum += c2.val;
c2 = c2.next;
}
digit.next = new ListNode(sum % 10);
digit = digit.next;
carry = sum / 10;
}
if(carry > 0){
digit.next = new ListNode(1);
digit = digit.next;
}
return dummy.next;
}
}