标签:
链表、栈
题目:
假设链表中每一个节点的值都在 0 - 9 之间,那么链表整体就可以代表一个整数。
给定两个这种链表,请生成代表两个整数相加值的结果链表。
数据范围:0 \le n,m \le 10000000≤n,m≤1000000,链表任意值 0 \le val \le 90≤val≤9
要求:空间复杂度 O(n)O(n),时间复杂度 O(n)O(n)
例如:链表 1 为 9->3->7,链表 2 为 6->3,最后生成新的结果链表为 1->0->0->0。
输入:[9,3,7],[6,3]
返回值:{1,0,0,0}
说明:如题面解释
输入:[0],[6,3]
返回值:{6,3}
反思:
首先我们由于我们计算是从个位数开始算起的,所以我们需要将两个链表反转过来,然后由于是加法进位操作,我们需要定义一个进位变量来记录,又因为我们在相加的时候,有可能链表1取出来的值为空、链表2取出来的值为空、我们的进位不等于0,这个时候,我们都需要进行处理,如果去出来的值为空,那么我们需要返回0,因为有可能这个时候进位不为0。
其次我们需要在总和的时候注意要将进位加上,我们为什么要加上它?在各位数的时候,它一定是0,所以加上它没有什么影响,而个位数加完之后,进位可能是1了,这个时候,我们就需要加上去。所以要将它加到总和里面去。
最后一个需要注意的就是,我们在定义指针和指针的移动(这里是难点),我们把名字定义好,见名知意就容易理解了。
具体步骤
- step 1:将链表放入栈中
- step 2:定义进位值、定义接收取模后的值、定义被newNode指向的值
- step 3:取出栈中的值进行相加,注意总和需要加上进位
- step 4:返回定义被newNode指向的值
用到的知识点:
链表、栈
代码:
public class Solution {
/**
*
* @param head1 ListNode类
* @param head2 ListNode类
* @return ListNode类
*/
public ListNode addInList (ListNode head1, ListNode head2) {
// write code here
// 将链表放入栈中
Stack<Integer> stack1 = getStack(head1);
Stack<Integer> stack2 = getStack(head2);
// 定义进位值
int upVal = 0;
ListNode newNode = null;// 定义接收取模后的值
ListNode tail = null;// 定义被newNode指向的值
// 取出栈中的值进行相加
while (!stack1.isEmpty() || !stack2.isEmpty() || upVal != 0) {
int popFromStack1 = stack1.isEmpty() ? 0 : stack1.pop();
int popFromStack2 = stack2.isEmpty() ? 0 : stack2.pop();
// 这个进位 最多是1,因为最大是9 + 9 +1 = 19
int sum = popFromStack1 + popFromStack2 + upVal;
upVal = sum / 10;
// 下面的难理解一些,我们用数字来理解
// [9,3,7]
// [6,3]
//[1,0,0,0]
newNode = new ListNode(sum % 10);
newNode.next = tail;
tail = newNode;
}
return tail;
}
public Stack<Integer> getStack(ListNode node) {
Stack<Integer> stack = new Stack();
while (node != null) {
stack.push(node.val);
node = node.next;
}
return stack;
}
}