两数相加
题目描述:
给出两个 非空 的链表用来表示两个非负的整数。 其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
方法一:
根据题中所述可知:两个非负整数逆序存储于两个链表中,求这两个非负整数的和。
思路: 同时遍历两个链表,将得到的两个值相加存于结果链表就可以啦;但是这只有当两个链表的长度一样才可以哒,咋办呢?把短点的链表后面补0就是了撒;哪两数相加满10进1又咋办呢?嘿嘿~~,给一个变量carry来存储进位值,当进行下位计算时将其加上就是咯,,,
步骤:
- 定义一个头节点head,尾节点Last
- 定义一个变量carry用于存储进位值
- 当两个链表不为空时遍历链表,两值相加,存于结果链表head
- 返回结果链表head
代码
public Node solute(Node list1, Node list2) {
Node head = null;//头节点
Node Last = null;//辅助节点
int carry = 0;//用于存储进位值
while (list1 != null || list2 != null) {//当两个链表均为空时结束遍历,即两个链表的值已遍历完
int num1 = list1 != null ? list1.num : 0;// 若链表1不为空,得到链表1的值;若为空,则补零
int num2 = list2 != null ? list2.num : 0;// 若链表2不为空,得到链表2的值;若为空,则补零
int sum = num1 + num2 + carry;
if (head == null) {
head = Last = new Node(sum % 10);
} else {
Last.next = new Node(sum % 10);
Last = Last.next;
}
carry = sum / 10;
if (list1 != null) {
list1 = list1.next;
}
if (list2 != null) {
list2 = list2.next;
}
}
if (carry > 0) {//当链表遍历完后,可能存在还会进位,所以要将其加入到链表最后
Last.next = new Node(carry);
}
return head;
}
方法二(递归):
代码
public Node solute(Node list1,Node list2,int carry) {
if(list1==null&&list2==null&&carry==0) {
return null;
}
int sum = (list1!=null?list1.num:0)+(list2!=null?list2.num:0)+carry;
Node head = new Node(sum%10);
head.next=solute2(list1!=null?list1.next:null,list2!=null?list2.next:null,sum/10);
return head;
}
用递归来做,代码就少很多了~~~~