题目
我的题解
/**
* 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 result = new ListNode();
ListNode tail = result;
int carry = 0; // 进位标志
int sum;
while (l1 != null || l2 != null) {
sum = (((l1 != null) ? l1.val:0) + ((l2 != null) ? l2.val:0) + carry);
carry = sum /10;
tail.next = new ListNode(sum % 10);
tail = tail.next;
l1 = (l1 != null) ? l1.next : null;
l2 = (l2 != null) ? l2.next : null;
}
// 最后还有进位
if (carry > 0) {
tail.next = new ListNode(carry);
tail = tail.next;
}
return result.next;
}
}
参考解析,发现carry可以合并在while中,使得程序更工整简短,将代码精简如下。
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode result = new ListNode();
ListNode tail = result; // 一直指向result的尾部
int carry = 0; // 进位数
int sum;
while (l1 != null || l2 != null || carry != 0) {
sum = (((l1 != null) ? l1.val:0) + ((l2 != null) ? l2.val:0) + carry);
carry = sum /10;
tail.next = new ListNode(sum % 10);
tail = tail.next;
l1 = (l1 != null) ? l1.next : null;
l2 = (l2 != null) ? l2.next : null;
}
return result.next;
}
}
总结
- 难点是了解清楚单向链表的性质,尤其是指针所指向的位置;其他算法很普通