LeetCode Two Add Two Numbers (JAVA)

问题简介:输入两个数字链表,输出求和后的链表(链表由数字位数倒序组成)

问题详解:

给定两个非空链表,表示两个非负整数. 数字以相反的顺序存储,每个节点包含一位数字.对两个整数作求和运算,将结果倒序作为链表输出.

举例:

输入: (1 -> 4 -> 2) + (5 -> 6 -> 4);

输出: 6 -> 0 -> 7;

说明: 241 + 465 = 706.

链表结构:

Java 解法一:

扫描二维码关注公众号,回复: 5801181 查看本文章

官方实现 : Elementary Math

实现过程是差不多的,只是在定义x,y时的位置不一样.

复杂度分析:

时间复杂度 :近似于O(n):单层循环,由链表长度决定,近似于n次.

空间复杂度 :近似于 O(n):单层循环,新链表的长度最长近似于n.

拓展提问:

如果输入的链表是顺序存储的该怎么做?

举例:

输入: (2 -> 4 -> 1) + (4 -> 6 -> 5);

输出: 7 -> 0 -> 6;

说明: 241 + 465 = 706.

注:

1.求单链表长度

2.数组和链表的关系:

数组:静态分配内存,在内存中连续,利用下标定位查询,时间复杂度为0(1),插入和删除的复杂度为o(n).

优点:查找速度快.

缺点:

1.可能浪费内存(因为是连续的,所以每次申请数组之前必须规定数组的大小,如果大小不合理,则可能会浪费内存);

2.内存空间要求高,必须有足够的连续内存空间;

3.数组大小固定,不能动态拓展.

链表:动态分配内存,内存不连续,链表定位元素时间是复杂度O(n),链表插入或删除元素的的时间复杂度O(1)。

优点:

1.插入删除速度快(通过next的指向可以方便的删除元素);

2.内存利用率高,基本不会浪费内存(可以使用内存中细小的不连续空间,并且在需要空间的时候才创建空间);

3.大小没有固定,拓展灵活.

缺点:

不能随机查找,通过遍历的方式查找,效率低.

小白刷题之路,请多指教— — 要么大器晚成,要么石沉大海.

猜你喜欢

转载自www.cnblogs.com/lalalaczq/p/10664073.html