题目
- 给定两个非空链表,每一个节点代表一个数字0-9,单个链表从左往右是由高位到低位组成的一个数,现在需要将两个链表表示的数相加并且以链表形式返回。
- 举例:Input: (7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4) Output: 7 -> 8 -> 0 -> 7
- 可不可以不采用逆序的方式实现
解题思路
- 按照加法计算方法,我们需要从低位开始计算然后进位给高位,题中所给的是高位到低位,如果低位相加那就要从后往前走,但是单链表只能从前往后,那么这个时候最好的方法就是将两个链表逆序,然后再遍历相加得到结果组成新的链表返回。
- 但是如果要求不使用逆序实现,那么我们只能采用栈的后进先出实现,我们将l1和l2两个链表分别压入栈stack1和stack2,然后在用出栈的方式相加得到最后的结果赋予新的链表即可得到我们想要的结果。
- 在使用栈的过程中,因为我不想使用过多的空间,所以我想的是出栈相加之后的值直接在原链表上进行值的覆盖,而不是开辟新的链表,这个过程需要以较长链表为标准进行覆盖。
- 覆盖后需要检查高位相加是否有进位,如果有进位需要再创建一个头结点连接链表返回,如果没有进位则直接返回最长链表
源代码实现
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
Stack<ListNode> stack1 = new Stack<>();
Stack<ListNode> stack2 = new Stack<>();
ListNode index1 = l1, index2 = l2;
int length1=0, length2=0;
int carry = 0;//进位符
while (index1 != null || index2 != null) {
if (index1 != null) {
stack1.push(index1);
index1 = index1.next;
length1++;
}
if (index2 != null) {
stack2.push(index2);
index2 = index2.next;
length2++;
}
}
if (length1 > length2) {
while (!stack1.isEmpty()) {
ListNode temp1 = stack1.pop();
int val2 = stack2.isEmpty() ? 0 : stack2.pop().val;
int result = temp1.val + val2 + carry;
temp1.val = result % 10;
carry = result / 10;
}
if (carry == 1) {
ListNode newNode = new ListNode(1);
newNode.next = l1;
return newNode;
} else return l1;
} else {
while (!stack2.isEmpty()) {
int val1 = stack1.isEmpty() ? 0 : stack1.pop().val;
ListNode temp2 = stack2.pop();
int result = val1 + temp2.val + carry;
temp2.val = result % 10;
carry = result / 10;
}
if (carry == 1) {
ListNode newNode = new ListNode(1);
newNode.next = l2;
return newNode;
} else return l2;
}
}
}