对于链表,如果要从后往前操作,一般就是用递归最方便
每次递归完返回进位(0 或者 1).
链表最前方加上个sentinal node以防最高位进位,e.g. (99+1=100)
时间 O(n)
空间 O(n): basecase时每一位的node都在栈上
import java.util.*;
public class Solution {
public ListNode plusOne (ListNode head) {
ListNode sentinal = new ListNode(0);
sentinal.next = head;
plusOneRecurse(sentinal);
// 如果没有最高位进位(e.g. 98+1=99), 返回值就不包括sentinal
if (sentinal.val == 0) {
return sentinal.next;
}
// 如果有最高位进位(e.g. 99+1=100), 返回值就包括sentinal
return sentinal;
}
private int plusOneRecurse(ListNode head) {
// basecase返回1用于实现“加一”
if (head == null) return 1;
int remainder = plusOneRecurse(head.next);
if (remainder + head.val == 10) {
head.val = 0;
return 1;
} else {
head.val += remainder;
return 0;
}
}
}