一、题目
描述
假设链表中每一个节点的值都在 0 - 9 之间,那么链表整体就可以代表一个整数。
给定两个这种链表,请生成代表两个整数相加值的结果链表。
数据范围:0≤𝑛,𝑚≤10000000≤n,m≤1000000,链表任意值 0≤𝑣𝑎𝑙≤90≤val≤9
要求:空间复杂度 𝑂(𝑛)O(n),时间复杂度 𝑂(𝑛)O(n)
例如:链表 1 为 9->3->7,链表 2 为 6->3,最后生成新的结果链表为 1->0->0->0。
编辑
示例1
输入:
[9,3,7],[6,3]
返回值:
{1,0,0,0}
说明:
如题面解释
示例2
输入:
[0],[6,3]
返回值:
{6,3}
备注:
1 ≤ 𝑛, m ≤ 106
0 ≤ 𝑎𝑖, bi ≤ 9
二、思路解析
所谓链表相加,其实也是 大数加法 的一类变式,建议各位先看看我这篇博客,了解一下什么是大数加法👇
「笔试刷题」:大数加法http://t.csdnimg.cn/ZUNRK
Ok,有了上面的基础之后,我们就来拆解下这道题了。
大数加法的本质,是模拟小学的列竖式计算,而根据竖式计算规则,就要从低位开始计算了。
在字符串中,我们可以直接从后向前遍历,但在链表,我们就需要先进行逆序操作了。
逆序完了之后,我们可以发现,其实就和上面那篇博客很类似了,模版几乎一样,都是通过一个变量,记录两个字符串低位之和。
最后,我们把结果逆序返回即可。
具体实现请看下面代码👇
三、完整代码
import java.util.*;
/*
* public class ListNode {
* int val;
* ListNode next = null;
* public ListNode(int val) {
* this.val = val;
* }
* }
*/
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param head1 ListNode类
* @param head2 ListNode类
* @return ListNode类
*/
public ListNode reverse(ListNode head){
ListNode newHead = new ListNode(0);
ListNode cur = head;
while(cur != null){
ListNode Next = cur.next;
cur.next = newHead.next;
newHead.next = cur;
cur = Next;
}
return newHead.next;
}
public ListNode addInList (ListNode head1, ListNode head2) {
head1 = reverse(head1);
head2 = reverse(head2);
ListNode cur1 = head1;
ListNode cur2 = head2;
int t = 0;
ListNode ret = new ListNode(0);
ListNode prev = ret;
while(cur1 != null || cur2 != null || t != 0){
if(cur1 != null){
t += cur1.val;
cur1 = cur1.next;
}
if(cur2 != null){
t += cur2.val;
cur2 = cur2.next;
}
prev = prev.next = new ListNode(t % 10);
t /= 10;
}
return reverse(ret.next);
}
}
以上就是本篇博客的全部内容啦,如有不足之处,还请各位指出,期待能和各位一起进步!