这是leetcode上的第2题
题目如下:
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
链接:https://leetcode-cn.com/problems/add-two-numbers
我的解法是:
算法思想:
* 首先遍历链表,看链表是否为0,如果为了则直接返回另一个链表
* 然后遍历链表中的元素,并将其保存在队列中
* 再依次取出队列中的元素,创建单链表
最开始使用的是int,发现不通过又换位long,最后有换位BigInteger
这道题在考察链表的知识之外,还考察了大数相加
下面这个解法容易理解,但是效率不高,执行时,只超过了20%的提交记录
import java.math.BigInteger;
import java.util.LinkedList;
import java.util.Queue;
public class The2 {
/**
* 算法思想:
* 首先遍历链表,看链表是否为0,如果为了则直接返回另一个链表
* 然后遍历链表中的元素,并将其保存在队列中
* 再依次取出队列中的元素,创建单链表
*/
private Queue<Integer> queue = new LinkedList<>();
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
//如果v1或者v2所代表的值为0,那么就返回另外一个
int v1 = getEnd(l1);
if (v1 == 0) {
return l2;
}
int v2 = getEnd(l2);
if (v2 == 0) {
return l1;
}
BigInteger sum = getAll(l1).add(getAll(l2));
reverse(sum);
return transform();
}
/**
* 根据队列创建单链表
* 先创建一个根节点,然后创建一个指针节点
* 依次向队列中的元素,同时指针节点后移
*/
private ListNode transform() {
ListNode root = new ListNode(0);
ListNode tem = root;
while (queue.peek() != null) {
ListNode node = new ListNode(queue.poll());
tem.next = node;
tem = node;
}
return root.next;
}
//得到一个整数的所有位的元素
private void reverse(BigInteger sum) {
String s = sum.toString();
String[] arr = s.split("");
for (int i = arr.length - 1; i >= 0; i--) {
queue.offer(Integer.parseInt(arr[i]));
}
}
//得到链表的所有元素并反序
private BigInteger getAll(ListNode node) {
StringBuilder res = new StringBuilder();
while (node.next != null) {
res.append(node.val);
node = node.next;
}
res.append(node.val);
return new BigInteger(res.reverse().toString());
}
/**
* 返回当前链表的最后一个节点的值
* 即当前整数的开头
*
* @param node
*/
private int getEnd(ListNode node) {
while (node.next != null) {
node = node.next;
}
return node.val;
}
}