学习目标:
目标:熟练运用Java所学知识
学习内容:
本文内容:使用java解决 链表求和
题目描述
给定两个用链表表示的整数,每个节点包含一个数位。
这些数位是反向存放的,也就是个位排在链表首部。
编写函数对这两个整数求和,并用链表形式返回结果。
示例:
输入:
(7 -> 1 -> 6) + (5 -> 9 -> 2),
即617 + 295
输出:2 -> 1 -> 9,即912
解题思路
- 根据题目描述,这些数位是反向存放的,也就是个位排在链表首部。
- 从链表头部开始进行遍历
- 设置一个新的链表用来存储相加后数字的每一位数字
- 因为给出的两个链表长度不一等相等,所以进行遍历相加时我们可以判断一下当前结点是不是空的,如果是空的就将当前位记录为0,否则记录为当前结点的val值
- 使用变量sum记录两个链表当前位的和,将sum%10 的值存储到新链表中,然后sum值更新为sum/10,也就是需要的进位
实现代码
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode cur1=l1,cur2=l2;
ListNode newHead=new ListNode(0);//新链表
ListNode newTail=newHead;
int sum=0;
while(cur1!=null||cur2!=null){
int temp1=(cur1==null?0:cur1.val);//判断当前结点是不是空
int temp2=(cur2==null?0:cur2.val);
sum+=temp1+temp2;//记录两个位置和进位的和
newTail.next=new ListNode(sum%10);//将sum%10存储到新链表
sum/=10;//更新sum的值
if(cur1!=null){
cur1=cur1.next;
}
if(cur2!=null){
cur2=cur2.next;
}
newTail=newTail.next;
}
if(sum!=0){
//循环结束之后如果sum不是0,说明还需要进位
newTail.next=new ListNode(sum);
}
return newHead.next;
}
}