在日常我们学习数据结构和算法的知识,一定不能只停留在看书、看视频层面,一定要自己多练习,纸上得来终觉浅,绝知此事要躬行。
题目内容
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例 1:
输入:l1 = [2,4,3], l2 = [5,6,4] 输出:[7,0,8] 解释:342 + 465 = 807.
示例 2:
输入:l1 = [0], l2 = [0] 输出:[0]
示例 3:
输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9] 输出:[8,9,9,9,0,0,0,1]
提示:
- 每个链表中的节点数在范围
[1, 100]
内 0 <= Node.val <= 9
- 题目数据保证列表表示的数字不含前导零
解题方法
解题思路
拿到题目,理解题意之后:
(1)我们需要从头部遍历到尾部。
(2)两个数据相加可能会有进位的情况,所以我们需要有个变量 把进位保存下来。
需要额外考虑的情况:
(1)链表长度一样或者不一样
(2)进位的数值 需要一直参与计算,且链表长度一致最后一位也可能是1
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
if (l1 == null || l2 == null) {
return null;
}
ListNode newHead = new ListNode(-1);
ListNode cur = newHead;
int carry = 0;
while(l1 != null || l2 != null || carry != 0) {
int v1 = l1 == null ? 0 : l1.val;
int v2 = l2 == null ? 0 : l2.val;
int vv = (v1 + v2 + carry) % 10;
carry = (v1 + v2 + carry) / 10;
ListNode newNode = new ListNode(vv);
cur.next = newNode;
cur = cur.next;
l1 = l1 == null ? null : l1.next;
l2 = l2 == null ? null : l2.next;
}
return newHead.next;
}
}
执行用时分布 1ms,击败100.00%使用 Java 的用户
题目扩展
如果是两个链表从尾部到头部进行相加。
(1)我们需要从尾部遍历到头部,但是题目中是个单链表,很容易想到用栈把数据进行保存。
(2)两个数据相加可能会有进位的情况,所以我们需要有个变量 把进位保存下来。
特殊情况的思考:
(1)两个链表长度相同,两个链表头相加后可能还会有进位1
(2)两个链表长度不一致
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param head1 ListNode类
* @param head2 ListNode类
* @return ListNode类
*/
public ListNode addInList (ListNode head1, ListNode head2) {
if (head1 == null || head2 == null) {
return null;
}
// write code here
Stack<ListNode> stack1 = new Stack<>();
Stack<ListNode> stack2 = new Stack<>();
Stack<ListNode> result = new Stack<>();
while(head1 != null) {
stack1.push(head1);
head1 = head1.next;
}
while(head2 != null) {
stack2.push(head2);
head2 = head2.next;
}
int carry = 0;
while(!stack1.isEmpty() || !stack2.isEmpty() || carry != 0) {
int val1 = 0;
int val2 = 0;
if (!stack1.isEmpty()) {
val1 = stack1.pop().val;
}
if (!stack2.isEmpty()) {
val2 = stack2.pop().val;
}
int value = (val1 + val2 + carry) % 10;
carry = (val1 + val2 + carry) / 10;
result.push(new ListNode(value));
}
ListNode dummy = new ListNode(-1);
ListNode newHead = dummy;
while(!result.isEmpty()) {
ListNode node = result.pop();
System.out.println(node.val);
dummy.next = node;
dummy = dummy.next;
}
return newHead.next;
}