刷题笔记5:链表的操作
题目:
思路:
1.刚开始读题,感觉是一道很容易的题目,就是把2个链表里的元素从头遍历,将位数对应的元素相加,有进位的给高位,将结果保存到新链表中。可实际操作起来,确是小问题不断,主要的就是当相加到最后一位时,进位按是否为0的取舍问题。
2.整体思路:
1>先计算两个数等长的部分,不等长的部分,后面再做处理;
2>等长部分的处理为:设置一个进位,每次求和和进位时必须考虑上一次的进位;然后还需要考虑等长时,最后一位的进位怎么处理,有进位时需要在最后和列表增加一个节点放进位,没有进位则不需要。这里重点是关注和指针连接新节点的条件设置
3>对于数1或者数2较长时,将等长部分的的进位与较长数剩下的位进行加法,逻辑与等长时相同,注意也是最后一位进位的处理;
4>细致的解释在代码中标注。
代码:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
int temp=0;//用来存储进位,每个位置上用完之后需要重新初始化为0
ListNode sum=new ListNode(0);//用来存储两数和的每一位
//定义三个指针分别指向l1,l2,sum;用来做加法时的辅助指针
ListNode h1=l1;
ListNode h2=l2;
ListNode h3=sum;
//判断当第一个数或者第二个数的所有位遍历结束后退出循环;这里的链表没有头结点,所以不能用next不为空判别,那样会导致链表的最后一个元素遍历不到
while(h1!=null&&h2!=null){
//每次加完存放结果都需要开辟一个新节点与sum的上一个节点连起来
ListNode add=new ListNode(0);
//求对应的位置之和,用取余数的方式
h3.val=(h1.val+h2.val+temp)%10;
//求当前位置的进位
temp=(h1.val+h2.val+temp)/10;//本位向下一位的进位
//这里是关键步骤:1.当遍历到数1或者数2的最后一位时,要判断,是否他们两个等长,若不等长,则剩余的位还需要继续做加法,所以要让指针h3指向新开辟的节点
if(h1.next!=null||h2.next!=null){
h3.next=add;
h3=add;
}
h1=h1.next;
h2=h2.next;
//2.这一步是为了匹配两数等长,且最后一位有进位时,要将h3连接到新节点,并为其赋值进位的值;若等长无进位,则不必将其连接新节点
if(h1==null&&h2==null&&temp!=0){
h3.next=add;
h3=add;
h3.val=temp;
break;
}else if(h1==null&&h2==null&&temp==0){
h3.next=null;
break;
}
}
//当数1比数2长的时候,将数1剩下的位继续做加法,这里是低位的进位与剩余位之间的加法,逻辑与上面的相同,也是需要考虑加到最后一位,是否有进位,按情况处理
while(h1!=null){
ListNode add=new ListNode(0);
h3.val=(temp+h1.val)%10;
temp=(temp+h1.val)/10;
h1=h1.next;
if(h1==null&&temp!=0){
h3.next=add;
h3=add;
h3.val=temp;
break;
}else if(h1==null&&temp==0){
h3.next=null;
break;
}
h3.next=add;
h3=add;
}
//这是数2长的情况,与上面完全一致
while(h2!=null){
ListNode add=new ListNode(0);
h3.val=(temp+h2.val)%10;
temp=(temp+h2.val)/10;
h2=h2.next;
if(h2==null&&temp!=0){
h3.next=add;
h3=add;
h3.val=temp;
break;
}else if(h2==null&&temp==0){
h3.next=null;
break;
}
h3.next=add;
h3=add;
}
return sum;
}
}