→_→一言难尽的求知过程
题目:
思路:例示说的很清楚,但如果你想着用 链表.下标(类似a[i]或者把他想成一个字符串来解题)
哒咩T^T 那就证明,你把学过的数据结构忘得干净,这是链表啊!这是链表啊!这是链表啊!
跟顺序表不同,链表存储是随机的,一个结点里包含存储的数据var和指向下一个结点的指针next
首先要新建一个结点的类,里面包含数据和下一个结点位置两个信息, 方便后面需要结点时实例化,就比方你需要一个整型变量会 int a ,结点的方法里的内容是要自己写,然后ListNode newNode=new ListNode 这样实例化的。
每次都搞不明白,java一会public,一会public class,还能调用其他里面的方法??(学的浅,忘得净)回去看了一下,一个Java源文件最多包含一个public类,并且这个类必须与源文件同名,否则编译器报错,不能编译。
可以有多个class类,对于class、方法、函数的关系:
class是类,就比如人、箱子这都是没有具体指向的类,方法和函数是同一个东西只不过java里的函数叫方法,class类可以拥有属性和方法,方法需要定义在类中。class 箱子,把实现某些需求的方法放进类里也就是放进箱子里,把这个箱子打包,下次你需要的时候就实例化调用他(可能有时候需要参数)
public class box{
public void method(int a){
}
}
代码:在力扣上可以直接用solution类作为答案,测试时会传入测试参数,我想看到答案所以多写了main方法
public class test {
public static void main(String[] args) {
ListNode L1 = new ListNode(2, new ListNode(3));//实例化L1,L2然后传入结点值
ListNode L2 = new ListNode(5, new ListNode(6));
solution s1=new solution();//实例化solution类,solution是实现这道题的关键代码
s1.addTwoNumbers(L1,L2);//调用solution类中的addTwoNumbers方法并传入参数
}
}
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) {
// public ListNode addTwoNumbers(ListNode l1, ListNode l2){
ListNode dummyNode = new ListNode(0);//创建一个哑结点,他的指针指向新链表的头结点
ListNode preNode = dummyNode; //preNode表示当前结点的前一结点
int carry = 0;//表示两结点相加进位的值,加法最多只进一位,所以carry要么0要么1
while(l1 !=null||l2 !=null||carry!=0)
{ //两个链表只要一个不为空或者有进位就一直循环
int sum = carry;//当前结点的累加值,需要加上前面进位的值
if (l1 != null) {//如果第一个链表当前结点不为空,加上第一个链表当前节点的值
sum += l1.val;
l1 = l1.next;
}//第二个链表同上
if (l2 != null) {
sum += l2.val;
l2 = l2.next;
}//创建新链表,preNode的next指针指向新的链表,新链表结点里存的是l1,l2相同位相加结果的取余(要进位)
ListNode newNode = new ListNode(sum % 10);
preNode.next = newNode;
carry = sum / 10;//更新carry的值
preNode = newNode;//更新preNode,相当于往后跳下一个了
System.out.println(newNode.val);
}
return dummyNode.next;
}
}