2. 两数相加 - LeetCode
2. 两数相加
直接解法
/**
* 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 ans = null;
ListNode p1 = l1, p2 = l2, p3 = null;
int c = 0;
while(p1 != null && p2 != null){
if(p3 == null){
ans = new ListNode();
p3 = ans;
}
else{
p3.next = new ListNode();
p3 = p3.next;
}
p3.val = (p1.val + p2.val + c) % 10;
c = (p1.val + p2.val + c) / 10;
p1 = p1.next;
p2 = p2.next;
}
while(p1 != null){
p3.next = new ListNode();
p3 = p3.next;
p3.val = (p1.val + c) % 10;
c = (p1.val + c) / 10;
p1 = p1.next;
}
while(p2 != null){
p3.next = new ListNode();
p3 = p3.next;
p3.val = (p2.val + c) % 10;
c = (p2.val + c) / 10;
p2 = p2.next;
}
if(c != 0){
p3.next = new ListNode();
p3 = p3.next;
p3.val = c;
}
return ans;
}
}
简单讲就是逐位相加,判断进位。
注意的点
- 两个数长度可能不同
- 最后可能会多一位进位
- java的对象new出来就回不去了
简短写法
/**
* 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 root = new ListNode(0);
ListNode cursor = root;
int carry = 0;
while(l1 != null || l2 != null || carry != 0) {
int l1Val = l1 != null ? l1.val : 0;
int l2Val = l2 != null ? l2.val : 0;
int sumVal = l1Val + l2Val + carry;
carry = sumVal / 10;
ListNode sumNode = new ListNode(sumVal % 10);
cursor.next = sumNode;
cursor = sumNode;
if(l1 != null) l1 = l1.next;
if(l2 != null) l2 = l2.next;
}
return root.next;
}
}
评论区抄的,代码比较短,只有一个while,用三目运算符来判断两个数有没有到头,进位是否为0 ,感觉会慢一些。但都是100以内的数,最多3位,无所谓了。

浙公网安备 33010602011771号