2. 两数相加
迭代
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode dummyHead = new ListNode(-1);
ListNode head = dummyHead;
ListNode cur1 = l1;
ListNode cur2 = l2;
int n;
int sum;
int rest = 0;
/**
* 只要有一个链表没有遍历完就继续循环
* 分三种情况计算数字的和
*/
while (cur1 != null || cur2 != null){
if (cur1 != null && cur2 != null){
sum = cur1.val + cur2.val + rest;
cur1 = cur1.next;
cur2 = cur2.next;
}
else if (cur1 == null && cur2 != null){
sum = cur2.val + rest;
cur2 = cur2.next;
}
else {
sum = cur1.val + rest;
cur1 = cur1.next;
}
if (sum < 10){
n = sum;
rest = 0;
}
else if (sum == 10){
n = 0;
rest = 1;
}
else {
rest = sum / 10;
n = sum % 10;
}
/**
* 把数字和存储在新链表的新节点中
*/
head.next = new ListNode(n);
head = head.next;
}
/**
* 最后一位数字可能会发生进位,因此要单独判断一下
*/
if (rest == 1){
head.next = new ListNode(rest);
}
return dummyHead.next;
}
}
/**
* 时间复杂度 O(n)
* 空间复杂度 O(1)
*/
优化1——简化求和判断过程
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode dummyHead = new ListNode(-1);
ListNode head = dummyHead;
ListNode cur1 = l1;
ListNode cur2 = l2;
int n;
int sum;
int rest = 0;
/**
* 只要有一个链表没有遍历完就继续循环
* 分三种情况计算数字的和
* 最后一位数字可能会发生进位的情况合并进循环
*/
while (cur1 != null || cur2 != null || rest != 0){
/**
* 简化求和
* 如果节点不存在就默认为0
*/
sum = (cur1 == null ? 0 : cur1.val) + (cur2 == null ? 0 : cur2.val) + rest;
/**
* 简化加法进位
*/
n = sum % 10;
rest = sum / 10;
/**
* 把数字和存储在新链表的新节点中
*/
head.next = new ListNode(n);
head = head.next;
if (cur1 != null){
cur1 = cur1.next;
}
if (cur2 != null){
cur2 = cur2.next;
}
}
return dummyHead.next;
}
}
/**
* 时间复杂度 O(n)
* 空间复杂度 O(1)
*/
https://leetcode-cn.com/problems/add-two-numbers/submissions/