题目描述
假设链表中每一个节点的值都在 0 - 9 之间,那么链表整体就可以代表一个整数。
给定两个这种链表,请生成代表两个整数相加值的结果链表。
例如:链表 1 为 9->3->7,链表 2 为 6->3,最后生成新的结果链表为 1->0->0->0。
示例1
输入
[9,3,7],[6,3]
返回值
{1,0,0,0}
//方法二:使用栈,不需要反转链表
public ListNode addInListII(ListNode head1, ListNode head2) {
Stack<Integer> s1 = new Stack<>();
Stack<Integer> s2 = new Stack<>();
ListNode p1 = head1, p2 = head2;
while (p1 != null) {
s1.push(p1.val);
p1 = p1.next;
}
while (p2 != null) {
s2.push(p2.val);
p2 = p2.next;
}
int carry = 0;
ListNode dummy = new ListNode(-1);
while (!s1.empty() || !s2.empty() || carry != 0) {
int sum = carry;
if (!s1.empty()) {
sum += s1.pop();
}
if (!s2.empty()) {
sum += s2.pop();
}
ListNode cur = new ListNode(sum % 10);
cur.next = dummy.next;
dummy.next = cur;
carry = sum / 10;
}
return dummy.next;
}
//方法一:先反转两链表
//定义虚拟节点dummy和prev,prev指向dummy
//定义进位carry,循环遍历两链表,将两链表的值相加,并将prev指针指向相加的值
//最后将相加后链表再反转即可
//时间复杂度O(max(m,n)),其中m,n为两链表的长度
//空间复杂度O(max(m,n))
public ListNode addInListI(ListNode head1, ListNode head2) {
ListNode l1 = reverse(head1);
ListNode l2 = reverse(head2);
ListNode dummy = new ListNode(-1);
ListNode prev = dummy;
int carry = 0;
while (l1 != null || l2 != null || carry != 0) {
int sum = carry;
if (l1 != null) {
sum += l1.val;
l1 = l1.next;
}
if (l2 != null) {
sum += l2.val;
l2 = l2.next;
}
prev.next = new ListNode(sum % 10);
prev = prev.next;
carry = sum / 10;
}
return reverse(dummy.next);
}
private ListNode reverse(ListNode head) {
ListNode node = null;
ListNode cur = head;
while (cur != null) {
ListNode next = cur.next;
cur.next = node;
node = cur;
cur = next;
}
return node;
}