liuxuhelloworld's notebook

题目链接

https://leetcode.cn/problems/add-two-numbers-ii/

解答过程

这个题目和Problem2相似,区别在于Problem2里链表是倒序表示的整数,Problem445里链表是正序表示的整数。由于整数加法是从最低位到最高位处理,所以Problem2相对简单,只需要注意进位问题就可以了。那么比较直接的想法,就是把Problem445的链表做反转,相加以后再反转得到最终结果。然而题目中也指出,有没有解法可以不使用反转。

这个地方我一开始想到的是递归解法,代码提交以后也能通过,从代码来看,其实还比较好理解,只是进位的问题处理起来有点难看,使用了一个成员变量来存储递归过程中每次计算后的进位值。

后面看了官方题解,额,有一种恍然大悟的感觉。使用栈确实是更合乎逻辑、代码更简洁的解法。

	public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
		Stack<Integer> stack1 = new Stack<>();
		while (l1 != null) {
			stack1.push(l1.val);
			l1 = l1.next;
		}

		Stack<Integer> stack2 = new Stack<>();
		while (l2 != null) {
			stack2.push(l2.val);
			l2 = l2.next;
		}

		int carry = 0;
		ListNode dummy = new ListNode(-1);

		while (!stack1.isEmpty()
			|| !stack2.isEmpty()) {

			int val1 = 0, val2 = 0;
			if (!stack1.isEmpty()) {
				val1 = stack1.pop();
			}
			if (!stack2.isEmpty()) {
				val2 = stack2.pop();
			}

			int remain = (val1 + val2 + carry) % 10;
			carry = (val1 + val2 + carry) / 10;

			ListNode node = new ListNode(remain);
			node.next = dummy.next;
			dummy.next = node;
		}

		if (carry != 0) {
			ListNode node = new ListNode(1);
			node.next = dummy.next;
			dummy.next = node;
		}

		return dummy.next;
	}

相似题目