链表加法
public class ListNode {
//这是一个节点类
//里面保存值
int val;
//在一个类中定义自身的引用,为什么
ListNode next;
//存储的是下一个节点,可给他赋值,在这里是个引用
//这是节点的构造方法,构造方法是干什么的,构造这样一个类
// 一个类我觉得可以理解为一块存储空间
//我是大哥,你来分配,我来决定这个世界的规则
ListNode(int x){
//传入一个x给上面的变量
val=x;}
public static String print(ListNode l)
{
StringBuilder sb = new StringBuilder();
//遍历链表,缓冲区,缓冲区遍历。
while(l != null)
{
//加入到缓冲区
sb.append(l.val);
// 又来下一个元素
l = l.next;
}
//反转一下,输出才正确
sb.reverse();
//字符缓冲转化为数组
return sb.toString();
}
}
public class linkedlist {
/*两数相加*/
/*给定两个非空链表来表示两个非负整数,位数按照逆序方式存储,
他们的每个节点只存储单个字符,将两数相加返回一个新的链表
你可以假设除了0之外,这两个数字都不会以0开头*/
/*输入 2->4->3 + 5->6->4
*输出 7->0->8
*原因 342+465=807*/
//返回一个新的链表表示他们的和
public static ListNode addTwoNumbers(ListNode l1, ListNode l2){
//首先创建一个虚设节点 哑结点 傀儡节点都可以
ListNode dummyHead=new ListNode(0);
/*又定义三个节点类 curr装哑节点 */
ListNode p=l1,q=l2,curr=dummyHead;
//创建一个哑节点相当于新建链表初始化。
//定义一个表示进位的数
int carry=0;
while (p!=null||q!=null){
//如果两个节点的变量 val不是空的,就把节点的值赋值给x,y
int x=(p!=null)?p.val:0;
int y=(q!=null)?q.val:0;
int sum=carry+x+y;
carry=sum/10;
//curr就是表示新的节点的值
curr.next=new ListNode(sum%10);
curr=curr.next;
//p和q节点都指向他们下一个节点
if(p!=null) p=p.next; //接着遍历循环 如果还有数值的话
if(q!=null)q=q.next;
}
if(carry>0){
//如果有进位比如从二位数进位到三位数,又在链上
curr.next=new ListNode(carry);
}
//返回的是一个新的链表
return dummyHead.next;
}
public static void main(String[] args) {
ListNode l1 = new ListNode(2);
ListNode l2 = new ListNode(5);
ListNode listNode = l1.next = new ListNode(4);
ListNode listNode1 = l2.next = new ListNode(6);
listNode.next=new ListNode(8);
listNode1.next=new ListNode(4);
System.out.println(ListNode.print(addTwoNumbers(l1,l2)));
}
}