思想:既然不让直接逆置链表,则借助stack进行翻转,然后再按从低位开始计算,并将计算后的结果存入长链表节点中,这里需要额外注意:1、需要对短链表中的元素要进行特殊处理因为有可能它此时为null 2、另外还需要对最高位的进位进行处理
时间复杂度O(n) 空间复杂度O(m+n) m:短链表的长度 n:长链表的长度
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
LinkedList<ListNode> stack1 = new LinkedList<>();//借助栈进行逆置
LinkedList<ListNode> stack2 = new LinkedList<>();
while(l1!=null){
stack1.push(l1);
l1 = l1.next;
}
while(l2!=null){
stack2.push(l2);
l2 = l2.next;
}
LinkedList<ListNode> longList = (stack1.size()>=stack2.size())?stack1:stack2;
LinkedList<ListNode> shortList = (stack1.size()<stack2.size())?stack1:stack2;
ListNode tempHead = new ListNode(-1);//设立一个临时头结点,将计算后的结果进行头插法
int jw = 0;
while(!longList.isEmpty()){
ListNode lnode = longList.pop();
int lval = lnode.val;
int sval = (!shortList.isEmpty())?shortList.pop().val:0;//对短链表进行特殊处理
int val = lval+sval+jw;
lnode.val = val % 10;
jw = val/10;
lnode.next = tempHead.next;//头插
tempHead.next = lnode;
}
while(jw>0){//别忘记处理最高位的进位
ListNode temp = new ListNode(jw % 10);
temp.next = tempHead.next;
tempHead.next = temp;
jw/=10;
}
return tempHead.next;
}
}