给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807
public class ListNode {
int val;
ListNode next;
ListNode(int x) { val = x; }
}
这个是题目给出的ListNode格式 由此看出是其输入输出是链表格式 所以要有标记点标记链表当前位置 和头结点记录链表的起始位置(单向链表)
下面是我自己写的代码(参考答案)
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode l3 = new ListNode(0);//头结点记录位置
ListNode p =l1 , q= l2 , curr = l3;//curr是记录该链表当前位置 p q是l1,l2当前位置
int yu = 0;//升位 当两数相加大于十要进位 这点一定不能忘掉
while(p != null || q!=null){//判断两个是否为空 有一个不为空则要继续进行操作
int x = (p != null) ? p.val :0;
int y = (q!=null)?q.val:0;
int sum = yu+x+y;
yu = sum/10;
curr.next = new ListNode(sum%10);
curr = curr.next;//链表节点向前走
if(p != null) p = p.next;//链表节点向前走
if(q != null) q = q.next;//链表节点向前走
}
if(yu >0){
curr.next = new ListNode(yu);//最后计算出来发现还有进位则要再往前加一位
}
return l3.next;//返回头结点记录
}
}
看完我自己的我又去翻找了其他大神的 (再评论区发现有一个说是打败百分之九十九的31ms)
class Solution {//思路没有变 变换了写法 少去多个步骤吧
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
LinkedList<Integer> linkedList = new LinkedList<>();
//先创建一个List 将结果先保存到list中
ListNode n1 = l1;
ListNode n2 = l2;
do{
linkedList.push(n1.val + n2.val);//直接将结果保存 进位到最后统一处理
n1 = n1.next;
n2 = n2.next;
}while (n1 !=null && n2 !=null);
if (n1!=null)
//如果其中一个链表结束了 就只需要判断其中一个链表就行 省去对象创建赋值过程
do{
linkedList.push(n1.val );
n1 = n1.next;
}while (n1 !=null);
if (n2!=null)
//如果其中一个链表结束了 就只需要判断其中一个链表就行 省去对象创建赋值过程
do{
linkedList.push( n2.val);
n2 = n2.next;
}while (n2 !=null);
boolean jinwei =false;//统一处理进位 前一位有进位就将其加一
//在这里有一个小细节就是 刚好这位加了进位为10 又进了一位 所以需要在进位之后判断该值
for (int i = linkedList.size()-1; i >= 0; i--) {
if (jinwei){
linkedList.set(i,linkedList.get(i)+1);
}
if (linkedList.get(i)>9){
linkedList.set(i,linkedList.get(i)-10);
jinwei = true;
}else{
jinwei =false;
}
}
if (jinwei){//一样 结束之后还有进位就要再基础上再加一位
linkedList.push(1);
}
ListNode resNode = new ListNode(linkedList.pollLast());
ListNode node =resNode;
while (!linkedList.isEmpty()){//将list元素放到node中 将最后一位弹出
node.next = new ListNode(linkedList.pollLast());
node = node.next;
}
return resNode;
}
}
然后提交通过时间
其实我提交代码就这两种,但是时间是不一样的 所以有时候用时高不一定是自己代码的原因 可以多试几次