2021-06-16

3 篇文章 0 订阅
1 篇文章 0 订阅

刷题笔记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;
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值