孤酒读雨—个人网站

乐扣算法题--两数相加(个人理解)

作者: Fred

最近,在乐扣官网刷算法题,刷到两数相加的一道题,觉得很有意思,所以想把自己的解题过程记录下来。


其实起初开到这题,我是一脸懵逼的,这啥玩意?我对数据结构早就忘光光了,我是真看不懂,然后才去找别的解题方法进行参考,最后才慢慢的理解了。


题目如下:

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

看这图,我们再去写代码就很好懂了

在此,我使用的是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;

}

}

这段比较好理解,不做解释,到目前为止,就是这样的解题方式