这次讲解的题目是一个中等题,和链表的数据结构有关。接下来上题目:
链表的结构:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
思路如下:
话不多说先看图!
由图可知我们进行342+456相加的时候是从head头开始相加,一直到尾部结束的,因为head的头所代表的的val值正好就是我们的最低位,所以我们解题的思路就是:两链表从头节点开始向后遍历,定义一个新的链表来保存当前位置上数的和,并保存进位的值,再下一次循环的时候将进位值加上,循环!循环的结束条件就是l1链表和l2链表的next域均为null!
思路图如下图!
以上就是思路图,注意几点!
1.新定义的链表必须要有对它的引用(可以理解为指针)为什么呢?因为在给链表添加值的时候,我们会对它进行重新复制为next的操作,那么就是去了对头结点的引用了。
2.什么时候要对list进行新增下一个结点? 就是当当前对应的l1和l2有值得时候。
3.如果是1234+234这种会发生什么情况呢?假设l1是1234,l2是234,那么到千位的时候后出现1+null的情况,程序必然报错,所以我们进行的操作是如果位数不同,那么当前的位置上value值为0。
接下来上代码!
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode res=new ListNode(0); //用来表示结果的链表
ListNode point=res;//表示对res链表的引用,不然再遍历链表的时候会丢失引用
int up=0; //表示进位的值 不满10则为0,满10+则为1
while(l1!=null||l2!=null){ //循环开始 终止条件是next域均为null的情况
//先判断如果当前位无数值 先将当前位补0
int x=l1==null?0:l1.val;
int y=l2==null?0:l2.val;
int sum=up+x+y;
up=sum/10; //如果当前大于10,那么up的值保存到下次相加的时候
point.next=new ListNode(sum%10); //创建一个新的节点
point=point.next;//移动到写一个节点
//看l1和l2的下一个节点是否为空
if(l1!=null){//只要当前的next不为null,就赋值到下一个
l1=l1.next;
}
l2=(l2==null?l2:l2.next);
}
//如果最高位相加造成了进位,那么up一定为1,因为两个是的next都为null,就跳出了!
if(up==1){
point.next=new ListNode(up);
}
//因为通过point指针来操纵的链表赋值,所以res的next就是需要返回的值!
return res.next;
}
}
以上就是本次题目的讲解,如果有不对的地方,欢迎大家指出,谢谢!(图画的不好,见谅,毕竟不会画图的程序员不是好程序员~)