动手刷LeetCode-计算链表两数之和

知识点

操作链表节点;怎么创建一个新链表;怎么申请一个新节点;
还是 本无链表,节点申请多了,就成了链表了;

解题思路

法一:将长度较短的链表在末尾补零使得两个连表长度相等,再一个一个元素对其相加(考虑进位):
获取两个链表所对应的长度
在较短的链表末尾补零
对齐相加考虑进位

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        int len1=1;//记录l1的长度
        int len2=1;//记录l2的长度
        ListNode* p=l1;
        ListNode* q=l2;
        while(p->next!=NULL)//获取l1的长度
        {
            len1++;
            p=p->next;
        }
        while(q->next!=NULL)//获取l2的长度
        {
            len2++;
            q=q->next;
        }
        if(len1>len2)//l1较长,在l2末尾补零
        {
            for(int i=1;i<=len1-len2;i++)
            {
                q->next=new ListNode(0);
                q=q->next;
            }
        }
        else//l2较长,在l1末尾补零
        {
            for(int i=1;i<=len2-len1;i++)
            {
                p->next=new ListNode(0);
                p=p->next;
            }
        }
        p=l1;
        q=l2;
        bool count=false;//记录进位
        ListNode* l3=new ListNode(-1);//存放结果的链表
        ListNode* w=l3;//l3的移动指针
        int i=0;//记录相加结果
        while(p!=NULL&&q!=NULL)
        {
            i=count+p->val+q->val;
            w->next=new ListNode(i%10);
            count=i>=10?true:false;
            w=w->next;
            p=p->next;
            q=q->next;
        }
        if(count)//若最后还有进位
        {
            w->next=new ListNode(1);
            w=w->next;
        }
        return l3->next; 
    }
};

法二:不对齐补零,若链表不为空则用sum(代表每个位的和的结果)加上,考虑进位。

class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        ListNode* head=new ListNode(-1);//存放结果的链表
        ListNode* h=head;//移动指针
        int sum=0;//每个位的加和结果
        bool carry=false;//进位标志
        while(l1!=NULL||l2!=NULL)
        {
            sum=0;
            if(l1!=NULL)
            {
                sum+=l1->val;
                l1=l1->next;
            }
            if(l2!=NULL)
            {
                sum+=l2->val;
                l2=l2->next;
            }
            if(carry)
                sum++;
            h->next=new ListNode(sum%10);
            h=h->next;
            carry=sum>=10?true:false;
        }
        if(carry)
        {
            h->next=new ListNode(1);
        }
        return head->next;
    }
};

代码实现

自己写的代码:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * }; 增删改查四大要素
 */
class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        ListNode* result =new ListNode(-1); //存放结果的链表,-1就是个赋初始值而已
        ListNode* v = result;
        ListNode* p =l1;
        ListNode* q =l2;
        int len1=1; // 进行计算链表的长度
        int len2=1;
        int sum ;// 记录之和
        int i=0;
        // 进行将少的那一个链表进行补齐;
        if(p==NULL){
            return l2;

        }
        if(q==NULL){
            return l1;
        }
        // 获取长度
        while(p->next!=NULL){
            len1++;
            p=p->next; // 最后一个节点的地址
        }
        while(q->next!=NULL){
            len2++;
            q=q->next;
        }
        // 开始补齐
        if(len1<len2){
            for(i=0;i<(len2-len1);i++){
                p->next=new ListNode(0);
                p=p->next;

            }
        }
        else{
            for(i=0;i<(len1-len2);i++){
                q->next=new ListNode(0);
                q=q->next;
            }
        }

        // 初始化列表
        p=l1; // 这就是为什么没有直接使用l1的原因,否则的话找不到首地址了
        q=l2;

        int flag=0;

        while(p!=NULL&&q!=NULL){
            sum = p->val+q->val+flag;
            v->next=new ListNode(sum%10);
            if(sum>=10){
                flag=1;
            }
            else{
                flag=0;
            }
            
            p=p->next;
            q=q->next;
            v=v->next;

        }

        if(flag==1){
            v->next==new ListNode(1);
            v=v->next; // 这个地方必须加上,否则的话最后一个节点没有加上去

        }
        return result->next;



    }
};

不敢拖延了,不要自己总是想的自我感动自我美好了,没有规矩就是不成方圆,定好的计划就是一个承诺,不达成就别睡觉,熬夜掉头发也得上

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值