#力扣第二题,链表实现
题目:2、两数相加
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 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
- 题目数据保证列表表示的数字不含前导零
解题过程
思路
看到这一题,我们首先想到的应该是一种投机取巧的方式,先转到字符串,再转数字,相加后再转链表,很麻烦不是吗?
所以我还是摒弃了这种想法,来用正常的链表操做
首先就是想到一点,两个链表里的val值对应相加,链表当前的val值应该向后移动,这也是很容易就想到和实现的(例如有个l1链表如何逐个取到他的val呢,用到while循环判断当前的l1是否为空不为空的话进入循环,循环里先是取当前的val,也就是l1.val,然后再向后移动l1=l1.next,这样就能逐一取值了)。
其次就是两个链表如果长度不对等呢?
这个也很好解决,那就是来判断两个链表的当前和下一个指向是否为空,如果当前和下一个都为空那么该链表就没必要循环后都再去移动了,直接赋值成空就行
然后就是相加和建立存值的链表了,相加需要进位,所以我们用flag表示有进位,初始进位设置成0(第一个数相加不存在进位),如果l1.val加l2.val再加flag(前一位的相加结果)大于9,则flag设为1否则还是继续为0。
相加搞定,那就还剩存值了,存值是要将值存入链表中去而且列表要逐渐延长,我们这里选择先建立一个链表deff来存最终的结果链表,建立一个cutt来操作链表
(考虑到建表和操作链表我当时写的时候也想了很久,因为很长时间没有操作过链表了,这里做一下解释,如果直接操作deff是做不到添加后再使用deff进行返回的,只能通过添加中间变量来添加链表并返回deff,后面在解题过程里附加添加链表的代码块,可以参考一下)
解题过程
1、建立链表来存放返回的链表,以及建立中间链表来操作链表的添加
ListNode deff = new ListNode(0); ListNode cutt = deff;
2、设置一个进位标志 flag=0//初始值为0
3、进行加法操作并且向新链表添加结果
本处演示如何添加添加结果,向新链表不做判断
将l1和l2的数据之和添加到l3 while(l1!=null||l2!=null){ cutt.val=l1.val+l2.val; cutt = new ListNode(); l1=l1.next; l2=l2.next; (此处的代码可能有问题但逻辑是这么个逻辑) }
代码块(有很多判断,其实有很多是多此一举的,主要是懒得改了,凑合看吧,反正也是写给自己的)
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode deff = new ListNode(0);
ListNode cutt = deff;
int flag=0;
int x=0,y=0;
while(l1!=null||l2!=null){
x = (l1!=null)?l1.val:0;
y = (l2!=null)?l2.val:0;
cutt.val = (x + y+flag)%10;
if(x+y+flag>9){
flag=1;
}else{
flag=0;
}
if((l1!=null&&l1.next!=null)||(l2!=null&&l2.next!=null)){
cutt.next=new ListNode();
cutt=cutt.next;
}
if(l1!=null&&l1.next!=null){
l1 = l1.next;
}else {
l1=null;
}
if(l2!=null&&l2.next!=null){
l2 = l2.next;
}else {
l2=null;
}
}
if(flag==1){
cutt.next=new ListNode(1);
}
return deff;
}
}