问题描述
假设链表中每一个节点的值都在 0 - 9 之间,那么链表整体就可以代表一个整数。
给定两个这种链表,请生成代表两个整数相加值的结果链表。
例如:链表 1 为 9->3->7,链表 2 为 6->3,最后生成新的结果链表为 1->0->0->0。
输入描述:
输入两个链表
输出描述:
输出两个链表和的集合
示例
示例1
输入
[9,3,7],[6,3]
输出
{1,0,0,0}
解决思路
分析
- 链表正序没法计算,因为需要考虑进位的问题,所以我们需要先将链表倒置,然后依次加和得到结果。
方法
- 链表正序没法计算,因为需要考虑进位的问题,所以我们需要先将链表倒置,然后依次加和得到结果。
代码实现
// 思路1
public class Solution {
public ListNode addInList(ListNode head1, ListNode head2) {
head1 = revert(head1);
head2 = revert(head2);
ListNode dummy = new ListNode(0);
ListNode temp = dummy;
int carry = 0;
while (head1 != null && head2 != null) {
int val = head1.val + head2.val + carry;
temp.next = new ListNode(val % 10);
carry = val/10;
temp = temp.next;
head1 = head1.next;
head2 = head2.next;
}
while (head1 != null) {
int val = head1.val + carry;
temp.next = new ListNode(val % 10);
carry = val/10;
temp = temp.next;
head1 = head1.next;
}
while (head2 != null) {
int val = head2.val + carry;
temp.next = new ListNode(val % 10);
carry = val/10;
temp = temp.next;
head2 = head2.next;
}
if (carry != 0) {
temp.next = new ListNode(carry);
}
return revert(dummy.next);
}
// 链表的倒置
private ListNode revert(ListNode head) {
if (head == null) {
return null;
}
ListNode prev = null;
ListNode now = head;
while (now != null) {
ListNode next = now.next;
now.next = prev;
prev = now;
now = next;
}
return prev;
}
}
时间复杂度分析:
O(M+N):最终结果链表的倒置需要将整个链表的和遍历一遍,所以时间复杂度为O(M+N)【PS:这里也可以优化一下,时间复杂度为链表最长的一个,省去最后一步链表的倒置】
空间复杂度分析:
O(M+N):链表倒置后,使用了额外的空间存储。
小伙伴如果想测试的话,可以直接到牛客网这个链接做测试