LeetCode2 两数相加 Add Two Numbers
题目描述
题目地址:https://leetcode-cn.com/problems/add-two-numbers/
题目难度:中等
给出两个非空的链表用来表示两个非负的整数。其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字。
如果我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字0之外,这两个数都不会以0开头。
示例
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
分析
这道题主要考验的是我们对链表结构的熟悉程度,这道题最大的难点就在于想加的时候存在进位的情况,但是对我来说还有就是链表的结构,虽然说大学时学过数据结构和算法,当时是学懂了,但是长时间没看已经还给了老师,所以这道题对我来说还是有点挑战的。
-
首先题目默认给出了链表的基本结构,通过简单的分析与尝试,可以大致知道链表结构的基本特性,存储数据和读取数据顺序都是反着来的,不过这样反而方便我们在进位的时候直接进行操作;
-
另外还有一个小坑就是空链表的情况,可以通过创建一个只有头节点的链表,然后将他的下一个节点连接到给出的链表上;
-
还有就是需要复制链表地址,不能直接对物理地址进行操作,这样会导致操作过程中立案表结构发生改变。
解答
class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
}
}
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
//需要考虑空链表的情况
ListNode list = new ListNode(0);
ListNode p = l1;
ListNode q = l2;
ListNode l = list;
//进位变量
int plus = 0;
if (p == null && q != null) {
return q;
}
if (q == null && p != null) {
return p;
}
while (p != null || q != null) {
int x = p != null ? p.val : 0;
int y = q != null ? q.val : 0;
int sum = x + y + plus;
plus = sum / 10;
l.next = new ListNode(sum % 10);
l = l.next;
if (p != null) {
p = p.next;
}
if (q != null) {
q = q.next;
}
}
//最后一位是进位时
if (plus > 0) {
l.next = new ListNode(plus);
}
return list.next;
}
相似题目
leetcode19 删除链表的倒数第N个节点,后续添加地址
总结
通过这道题我大体上搞懂了链表的一些基本特性,以及使用过程中的一些注意事项。整体来说这道题不算复杂,只需要从最低位的数字开始相加,后面再加上进位,如果说有一个数字有很多位,则直接就将剩余的部分接到后边即可。
若是有哪里写的有问题,欢迎点出,万分感谢。