最近,在乐扣官网刷算法题,刷到两数相加的一道题,觉得很有意思,所以想把自己的解题过程记录下来。
其实起初开到这题,我是一脸懵逼的,这啥玩意?我对数据结构早就忘光光了,我是真看不懂,然后才去找别的解题方法进行参考,最后才慢慢的理解了。
题目如下:

看到这道题,使用的是链表结构做的,所以我们应该要先画图,我也不太会画,但是大致的图应该如下所示的

看这图,我们再去写代码就很好懂了
在此,我使用的是java语言去做的这道题
首先,因为因为是链表结构,我们需要一个链表类
static class ListNode{
int val;
ListNode next;
ListNode(int x)
{
val = x;
}
}
因为这个类我是放在了主类下面的,所以加上了static,不然无法访问到
这个类应该很好理解,不做太多解析,接下来
写我们的方法addTwoNumbers()
public static ListNode addTwoNumbers(ListNode l1,ListNode l2)
{
//定义一个空链表,没有指向任何结点
ListNode kong = new ListNode(0);
//把l1、l2的值赋给p和q,curr定义了当前节点
ListNode p = l1,q=l2,curr=kong;
//定义进位值,就是两数相加的进位
int carry = 0;
//如果p和q不是空,执行循环
while(p!=null || q!=null)
{
//如果p不是空,把p指向的值传给x
int x = (p!=null)?p.val:0;
//如果q不是空,把q指向的值传给y
int y = (q!=null)?q.val:0;
//把x和y和进位值加起来,就是结果
int sum = x+y+carry;
//计算进位值
carry = sum/10;
//定义新的节点,并且赋值给curr.next(就是说,如果结果是两位数,个位数留在结果链)
curr.next = new ListNode(sum%10);
//curr始终指向当前节点
curr = curr.next;
//p指向下一个结点
if(p!=null) p = p.next;
//q指向下一个节点
if(q!=null) q = q.next;
}
//这个主要目的是判断最后位数相加是否有进位值,有的话就得加入新节点
if(carry>0)
{
curr.next = new ListNode(carry);
}
return kong.next;
}
每一行代码都加上了注释,看起来是非常好理解的
接下来就是执行代码了
public static void main(String[] args) {
// 243+564=708
ListNode ln1_1 = new ListNode(2);
ListNode ln1_2 = new ListNode(4);
ListNode ln1_3 = new ListNode(3);
ln1_1.next = ln1_2;
ln1_2.next = ln1_3;
ListNode ln2_1 = new ListNode(5);
ListNode ln2_2 = new ListNode(6);
ListNode ln2_3 = new ListNode(4);
ln2_1.next = ln2_2;
ln2_2.next = ln2_3;
ListNode l3 = addTwoNumbers(ln1_1,ln2_1);
while(l3!=null){
System.out.println(l3.val);
l3 = l3.next;
}
}
这段比较好理解,不做解释,到目前为止,就是这样的解题方式