题目描述
用一个 非空 单链表来表示一个非负整数,然后将这个整数加一。
你可以假设这个整数除了 0 本身,没有任何前导的 0。
这个整数的各个数位按照 高位在链表头部、低位在链表尾部 的顺序排列。
输入: [1,2,3]
输出: [1,2,4]
加法计算过程
计算是从低位开始的,而链表是从高位开始的,所以要处理就必须反转过来,(原链表123 -> 321)从头开始加一。此时可以使用栈来实现。
解法
先把题目给出的链表遍历放到栈中,然后从栈中弹出栈顶数字digit,加的时候再考虑一下进位的情况就ok了,加完之后根据是否大于0决定是否要进位。
public ListNode plusOne(ListNode head) {
Stack<Integer> stack = new Stack<>();
while (head != null) {
stack.push(head.val);
head = head.next;
}
// 表示是否进位
int carry = 0;
ListNode dummy = new ListNode(-1);
int adder = 1;
while (!stack.isEmpty()) {
int digit = stack.empty() ? 0 : stack.pop();
int sum = digit + adder + carry;
carry = sum >= 10 ? 1 : 0;
sum = sum >= 10 ? sum - 10 : sum;
ListNode cur = new ListNode(sum);
cur.next = dummy.next;
dummy.next = cur;
adder = 0;
}
return dummy.next;
}
上述代码:
- carry: 记录进位的
- adder: 表示需要加的数1,。为什么不能直接使用1呢? 情况如下:
while (!stack.isEmpty()) {
int digit = stack.empty() ? 0 : stack.pop();
int sum = digit + 1+ carry;
carry = sum >= 10 ? 1 : 0;
sum = sum >= 10 ? sum - 10 : sum;
ListNode cur = new ListNode(sum);
cur.next = dummy.next;
dummy.next = cur;
adder = 0;
}
如果这样,会将我们每个位置都加1,如原始单链表{7,8},此时就会变成{8,9},而不是我们要的{7.9}。导致这样的原因是循环处理链表每个节点元素的时候sum = digit + 1+ carry。