Problem link: https://leetcode.com/problems/add-two-numbers-ii/#/description
You are given two non-empty linked lists representing two non-negative integers. The most significant digit comes first and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.
You may assume the two numbers do not contain any leading zero, except the number 0 itself.
Follow up:
What if you cannot modify the input lists? In other words, reversing the lists is not allowed.
Example:
Input: (7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 8 -> 0 -> 7
<问题描述>
给定两个非负整形的非空链表,整数的每一位以正常的顺序存储在链表中
你可以假定两个整数都没有前导的零
给出的addTwoNumbers函数应该以链表形式返回两个整数的和
输入:(7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 8 -> 0 -> 7
Approach #1 (利用reverse()函数反转链表)
Analysis
这道题是之前那道Add Two Numbers的拓展,可以看到这道题的最高位在链表的首位置,如果我们将链表反转一下,然后参考之前那道题的解决方法,问题就变得很容易了。关键在于如何实现链表反转函数reverse()。
Code
|
|
Complexity
时间复杂度:O(n)
空间复杂度:O(1)O(n)
Approach #2 (利用栈的后进先出存储节点数据)
Analysis
这里题目要求不使用reverse()函数,反转链表而不修改链表顺序,还有一种方法是利用栈来转换。由于加法需要从最低位开始运算,而最低位在链表末尾,链表只能从前往后遍历,没法取到前面的元素,我们可以利用栈来保存所有的元素,然后利用栈的后进先出的特点就可以从后往前取数字了。
Code
|
|
Complexity
时间复杂度:O(n)
空间复杂度:O(1)O(n)