没啥好说的,上来直接开搞,搞完再看题解
/**
* 直接遍历
*/
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode head = new ListNode(0);
ListNode res = head;
int tmp = 0;
while (true) {
res.val += l1.val + l2.val;
tmp = res.val / 10;
res.val = res.val % 10;
if (l1.next == null && l2.next == null) {
if (tmp != 0) {
res.next = new ListNode(tmp);
}
break;
}
if (l1.next != null) {
l1 = l1.next;
} else {
l1.val = 0;
}
if (l2.next != null) {
l2 = l2.next;
} else {
l2.val = 0;
}
res.next = new ListNode(tmp);
res = res.next;
}
return head;
}
看完题解后,发现思路基本一致,
注:虽然上边这段通过了测试用例,但其实改变了l1和l2两个对象。题解中给出的 p和q避免了这个问题
优化后
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode head = new ListNode(0);
ListNode curr = head, p = l1, q = l2;
int tmp = 0;
while (true) {
int x = p != null ? p.val : 0;
int y = q != null ? q.val : 0;
curr.val += x + y;
tmp = curr.val != 0 ? curr.val / 10 : 0;
curr.val = curr.val % 10;
p = p != null ? p.next : null;
q = q != null ? q.next : null;
if (p == null && q == null) break;
curr.next = new ListNode(tmp);
curr = curr.next;
}
if (tmp > 0)
curr.next = new ListNode(tmp);
return head;
}
贴上官方题解代码。
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;
}
作者:LeetCode
链接:https://leetcode-cn.com/problems/add-two-numbers/solution/liang-shu-xiang-jia-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。