1. 题目
给出两个非空的链表用来表示两个非负的整数, 其中他们各自的位数是按照逆序的方式存储的, 并且每个节点只能存储一位数字, 如果我们将这两个数相加起来会返回一个新的链表来表示他们的和
假设:这两个数都不会以0开头
2. 答案
/**
* 给出两个非空的链表用来表示两个非负的整数, 其中他们各自的位数是按照逆序的方式存储的, 并且每个节点只能存储一位数字
* 如果我们将这两个数相加起来会返回一个新的链表来表示他们的和
* 假设:这两个数都不会以0开头
*/
public class Solution {
/**
* 输入两个链表
* @param list 链表1
* @param list2 链表2
*/
public static void test(linkedList list, linkedList list2) {
linkedList list3 = new linkedList();
int nums = (list.getNums() > list2.getNums()) ? list.getNums() : list2.getNums();
// 标识进位
int bit = 0;
int x;
for (int i = 0; i < nums; i++) {
// 短的链表会出现null的情况
if (list.getFirst(i) == null) {
x = 0;
} else {
x = list.getFirst(i).getNum();
}
int y = list2.getFirst(i).getNum();
// 加法处理逻辑
if (x + y > 9) {
list3.add(new Node((x + y) % 10 + bit));
bit = (x + y) / 10;
} else {
list3.add(new Node(x + y + bit));
bit = (x + y) / 10;
}
}
list3.list();
}
public static void main(String[] args) {
// 测试demo
linkedList list = new linkedList();
list.add(new Node(9));
list.add(new Node(1));
linkedList list2 = new linkedList();
list2.add(new Node(1));
list2.add(new Node(2));
list2.add(new Node(3));
long startTime=System.currentTimeMillis(); //获取开始时间
test(list, list2);
long endTime=System.currentTimeMillis(); //获取结束时间
System.out.println("程序运行时间: "+(endTime-startTime)+"ms");
}
}
/**
* 链表
*/
class linkedList {
// 初始化头结点
private Node head = new Node(0);
// 获取最大的节点个数
public int getNums() {
int nums = 0;
Node temp = head;
while (true) {
if (temp.next == null) {
break;
}
temp = temp.next;
nums++;
}
return nums;
}
// 获取第n个节点
public Node getFirst(int n) {
Node temp = head;
for (int i = 0; i < n + 1; i++) {
temp = temp.next;
}
return temp;
}
// 打印链表
public void list() {
if (head.next == null) {
return;
}
Node temp = head.next;
while (true) {
System.out.println(temp);
if (temp.next == null) {
break;
}
temp = temp.next;
}
}
// 添加功能
public void add(Node node) {
Node temp = head; // 因为头结点不能动,所以这里用一个辅助节点来操作
while (true) {
if (temp.next == null) {
break;
}
temp = temp.next;
}
temp.next = node;
}
}
/**
* 节点
*/
class Node {
public Node(int num) {
this.num = num;
}
int num;
public void setNum(int num) {
this.num = num;
}
public int getNum() {
return num;
}
Node next;
@Override
public String toString() {
return "Node{" +
"num=" + num +
", next=" + next +
'}';
}
}