Leetcode(链表)两数相加(c++)

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

这题的测试数据边界条件特别多,要一一考虑。比如[5] [5], [9,8][1], [1][9,9,9]等。
添加两个bool函数,用于判断。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    //判断l1是否大于l2
    bool if_morethan(ListNode* l1, ListNode* l2){
        while(l1 !=NULL && l2 !=NULL){
            l1=l1->next;
            l2=l2->next;
        }
        if(l1 !=NULL) return true;
        else return false;
    }
    //判断l1==l2
    bool if_equal(ListNode* l1, ListNode* l2){
        while(l1 !=NULL && l2 !=NULL){
            l1=l1->next;
            l2=l2->next;
        }
        if(l1==NULL && l2==NULL) return true;
        else return false;
    }
  
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        // 判断是否存在[0]数组,存在则直接返回另一个链表即可
        if(l1->val==0 && l1->next==NULL)
            return l2;
        if(l2->val==0 && l2->next==NULL )
            return l1;
        //创建一个新结点和两个结点指针
        ListNode* new_list=new ListNode(0);
        ListNode* temp;
        ListNode* head;
        //将temp和head定义为链表长度较长的那个链表的头结点
        if(if_morethan(l1,l2))  //l1长度大于l2
        {
            new_list->next=l1;
            temp=l1;head=l1;
        }
        else {
            new_list->next=l2;
            temp=l2;head=l2;
        }
        //创建一个flag,用于判断l1,l2的长度是否相等
        bool flag=if_equal(l1, l2);
        //开始进入迭代相加的循环
        int num=0;
        while(l1 !=NULL && l2 !=NULL){
            if((l1->val+l2->val+num) >9){
                temp->val=((l1->val + l2->val + num) %10);
                num=1;
            }
            else{
                temp->val=((l1->val + l2->val + num) %10 ) ;
                num=0;
            }    
            temp=temp->next;
            l1=l1->next;
            l2=l2->next;
        }
        //创建一个val=1的结点
        ListNode* new_num=new ListNode(1);
        //如果num==1表示循环完了,但还要进位。如[5][5]
        if(num==1 && flag)//既要进位,且两个链表等长,要在末尾插入一个结点
        {
            while(head->next!=NULL){
                head=head->next;
            }
            head->next=new_num;
        }
        //既要进位,且两个链表不等长,如[1][9,9,9]
        if(num==1 && !flag)
        {
            temp->val +=1;
            while(temp->val==10){
                temp->val=0;
                if(temp->next==NULL)
                    temp->next=new_num;
                else{
                    temp->next->val +=1;
                }
                temp=temp->next;
            }
            
        }
        return new_list->next;
    }
};

第一遍写的非常复杂,因为在不断完善测试数据的边界条件。

参考了网友的解答,第二遍的while循环改成(l1 || l2)

class Solution {
public:
     ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        ListNode *result = new ListNode(0);
        ListNode *tmp = result;
        int sum = 0;
        while(l1 || l2){      
            if(l1){
                sum += l1->val;
                l1 = l1->next;
            }
            if(l2){
                sum += l2->val;
                l2 = l2->next;
            }
            tmp->next = new ListNode(sum%10);
            sum /= 10;
            tmp = tmp->next;
        }
        if(sum)
            tmp->next = new ListNode(1);
        return result->next;
    }


};
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值