题目
-
两个 非空 链表来代表两个非负整数,每个节点只存储一个数字
-
整数的最高位,位于链表开始位置 (正序)
-
两个数相加,返回一个新的链表
-
假设除了数字 0 之外,这两个数字都不会以零开头
题解:
1. 暴力解法
-
先将链表转换成数字,再相加,的结果
-
再将结果转换成链表
-
但是,链表所表示的数字会越界
2. 利用栈解决两数相加
-
依次将两个链表的节点,入栈
-
然后依次取出 这两个栈顶元素,进行相加,得到结果
-
但是这里得注意,栈顶元素相加,得到的是低位的值。我们需要头插法,得到结果
-
链表的结构:
public class ListNode { int val; // 数据域 ListNode next;// 指针域(下一个节点的地址值) public ListNode() { } // 无参构造 public ListNode(int val) { this.val = val; } // 有参构造 }
-
代码:
// 链表入栈 public static Deque<Integer> intoStack(ListNode node) { Deque<Integer> stack = new LinkedList<Integer>(); // 实例化栈 while (node != null) { stack.push(node.val); // 入栈 node = node.next; } return stack; } public ListNode addTwoNumbers(ListNode l1, ListNode l2) { // 初始化栈 Deque<Integer> stack1 = intoStack(l1); Deque<Integer> stack2 = intoStack(l2); int carry = 0; // 进位数 // 实例化新链表 ListNode headNode = null; ListNode curNode; // 循环迭代直到栈为空,或 进位为0 while (!stack1.isEmpty() || !stack2.isEmpty() || carry != 0) { // 获取栈顶元素(出栈) int a = stack1.isEmpty() ? 0 : stack1.pop(); int b = stack2.isEmpty() ? 0 : stack2.pop(); // 栈顶元素相加,的结果 int sum = a + b + carry; carry = sum / 10; // 得到进位数,若没有则为0 sum %= 10; // 取模,得到待插入节点的值。比如,sum=16,不能将16插入,需要取模,将6插入 // 头插法,构建结果链表 curNode = new ListNode(sum); curNode.next = headNode; headNode = curNode; } return headNode; }
-
代码中的 头插法
ListNode headNode = null; ListNode curNode; curNode = new ListNode(sum); curNode.next = headNode; headNode = curNode;