⚡考研面试⚡leetcode每天练——两数相加

Posted 肥学大师

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了⚡考研面试⚡leetcode每天练——两数相加相关的知识,希望对你有一定的参考价值。

题目:

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

你可以假设除了数字 0 之外,这两个数都不会以 0 开头。


输入: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
题目数据保证列表表示的数字不含前导零

做题

首先大家都知道题要求我们用链表解答那我们肯定要先建一个链表节点的类啊


class ListNode {
int val=0;
ListNode next;
ListNode() {}
ListNode(int val) { this.val = val; }
ListNode(int val, ListNode next) { this.val = val; this.next = next; }
}

这个类就不用我解释了吧,这要是看着还有点费劲我建议还是去好好学学数据结构和Java基础知识吧,要是要不到资源,下方留言我提供。废话不多说接着开始。

我这个解题方法跟官网上的还不一样,我是刚开始接触力扣我看题的形式我还以为要输入列表,然后转化为链表在运算呢,所以就有了以下的搞笑行为。来看看吧

先建立了数组列表:

public static List arry() {
		List l=new ArrayList();
		Scanner sc=new Scanner(System.in);
		System.out.print("请输入以#结尾:");
		boolean flag=true;
                //判断要是出现不是int型的数据就结束
		while(flag) {
			try {
				l.add(sc.nextInt());
				flag=true;
			}catch (Exception e) {
				flag=false;
			}
		}
		return l;
	}

这里我先建立了链表,😅确实尴尬本来想重新写呢。后来一想都写好了就没有弄掉
接着将数组列表转化为链表:

public static ListNode arryTransferList(List<Integer> a) {
		ListNode head1 = null;
		for(int i:a) {
			if(head1==null) {
				ListNode temp=new ListNode(i,null);
				head1=temp;
				lis=head1;
			}else {
				ListNode temp=new ListNode(i,null);
				lis.next=temp;
				lis=temp;
			}
		}
		return head1;
	}

也没什么高深的地方,但是大家要注意一下List<Integer> a里面的Integer不能写成int会报错的。
最后就是关键代码了:

public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
		 ListNode d = new ListNode();
		    ListNode curr = d;
		    int carry = 0;
                    //当两个链表任意一个没有结束都接着进行
		    while (l1 != null || l2 != null) {
		        int x = l1 == null ? 0 : l1.val;//下面解释
		        int y = l2 == null ? 0 : l2.val;

		        int sum = x + y + carry;
		        curr.next = new ListNode(sum % 10);//大于9取个位
		        curr = curr.next;
		        carry = sum / 10;

		        if (l1 != null) l1 = l1.next;
		        if (l2 != null) l2 = l2.next;
		    }
		    if (carry != 0) curr.next = new ListNode(carry);
		    return d.next;
    }

这里使用了三目运算int x = l1 == null ? 0 : l1.val;这里的意思是在两个链表长度不一样的时候当一个链表已经加完了处于这个阶段时


给该节点的值假设成0这样不妨碍后面的运算。

好了今天的算法题就到这里了,我们明天再见。欢迎关注本专栏我们一起学习

🎃特别介绍:
📣小白练手专栏,适合刚入手的新人欢迎订阅编程小白进阶
📣有什么不明白的欢迎私信或留言,得到细致讲解。另外想要进阶的朋友可以关注练手项目专栏

📣另外想学JavaWeb进厂的同学可以看看这个专栏:传送们
📣是个面试和考研的算法练习我们一起加油上岸之路

以上是关于⚡考研面试⚡leetcode每天练——两数相加的主要内容,如果未能解决你的问题,请参考以下文章

⚡考研面试⚡算法每天练——最长回文子串

⚡考研面试⚡算法每天练——三数之和(中心扩散法)

拿来吧你!⚡考研面试⚡每天练—— Z 字形变换(StringBuilder的用法总结)

Leetcode 2. 两数之加(带图)

#yyds干货盘点# LeetCode面试题:两数相加

LeetCode 面试必备100题:Add Two Numbers 两数相加