题目
给你两个非空链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。
你可以假设除了数字 0 之外,这两个数字都不会以零开头。
思路
- 需要逆序处理时,首先靠考虑使用栈来解决。
- 将所有的链表数据压入栈中,然后再依次取出进行计算。
代码
/**
* 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<Integer> s1 = new Stack<>();
Stack<Integer> s2 = new Stack<>();
while(l1!=null){
s1.push(l1.val);
l1 = l1.next;
}
while(l2!=null){
s2.push(l2.val);
l2 = l2.next;
}
int carry=0;
ListNode head = null;
while(!s1.isEmpty()||!s2.isEmpty()||carry>0){
int sum=carry;
sum+=s1.isEmpty()?0:s1.pop();
sum+=s2.isEmpty()?0:s2.pop();
ListNode node = new ListNode(sum%10);
node.next = head;
head = node;
carry=sum/10;
}
return head;
}
}
算法复杂度分析
- 时间复杂度:
O(max(m,n))
。m和n分别是两个链表的长度。和O(m+n)
等价。 - 空间复杂度:
O(m+n)