题解 | #C++两个链表生成相加链表#

两个链表生成相加链表

http://www.nowcoder.com/practice/c56f6c70fb3f4849bc56e33ff2a50b6b

思路

1.用数组接收数据
2.逆制,将个位放置0下标处
3.补零
4.相加
5.逆制,恢复最高位放置在下标0处
6.用最终结果创建新链表,并将其返回

class Solution {
public:
    ListNode* addInList(ListNode* head1, ListNode* head2) {
//存在某一链表为空
        if(head1==nullptr)
            return head2;
        if(head2==nullptr)
            return head1;
//用数组接收链表中的数据
        vector<int> arr1,arr2;
        ListNode* p1=head1;
        ListNode* p2=head2;
        while(p1!=nullptr)
        {
            arr1.push_back(p1->val);
            p1=p1->next;
        }
        while(p2!=nullptr)
        {
            arr2.push_back(p2->val);
            p2=p2->next;
        }
//计算需要计算的元素个数分别为多少,并逆制,这样可以保证个位从下标0开始
        int sz1 ,sz2;
        sz1=arr1.size();
        sz2=arr2.size();
        reverse(arr1.begin(), arr1.end());
        reverse(arr2.begin(), arr2.end());
        vector<int> ret;
//给较短的一方补零,保证两个数组一样长
        if(sz1>sz2)//补0
        {
            for(int i=0;i<(sz1-sz2);i++)
                arr2.push_back(0);
        }
        else
        {
            for(int i=0;i<(sz2-sz1);i++)
                arr1.push_back(0);
        }
//得到较长数组的长度,并进行相加过程
        int sz=sz1 > sz2 ? sz1 : sz2;
        for(int i=0;i<sz;i++)
        {
            int sum=0;
            sum=arr1[i]+arr2[i];
            if(sum>9)//结果大于10
            {
                sum%=10;//保留个位
                ret.push_back(sum);
                if(i==sz-1)//如果i处于最后一位,并且还有进位,只能尾部插入1
                    ret.push_back(1);
                else//如果i不是最后一位,只需将下一位+1即可
                    arr1[i+1]+=1;

            }
            else//结果没有进位,则直接插入
            {
                ret.push_back(sum);
            }
        }
//逆转,将最高位转到从0开始
        reverse(ret.begin(), ret.end());
//重新创建链表,将其依次插入
        int szOfRet=ret.size();
        ListNode* head = new ListNode(0);
        ListNode* ptr=head;
        for(int i=0;i<szOfRet;i++)
        {
            ListNode* node=new ListNode(ret[i]);
            ptr->next=node;
            ptr=node;
        }
        //返回最终结果
        return head->next;


    }
};
全部评论

相关推荐

感觉自己陷入了死循环,因为不知道简历写什么所以什么也不想做,然后又什么都没做所以没得写。从三月到六月,三个月啊
零壹超人:没有简历 ➜ 不找项目 ➜ 没内容写 ➜ 更没简历 ➜ … 无限循环。你陷入了死锁,随便打破死锁的四个条件之一就可以了,打破循环等待,立即开始行动,不要等待;破坏占有且等待,立即抄一份简历先把简历写出来,再一点一点学简历上的东西
点赞 评论 收藏
分享
运营你豪哥:简历改改吧-非本、求职意向技术岗、无实习经历、内容空洞 如果简历不爆改的话,应该是会持续崩溃了 1.把你教育经历放最下面去 2.蓝底照片很奇怪哈,感觉还在高中时代,建议白底重新拍一下 3.校园经历没啥必要,收集和反馈同学们对产品的意见,解决学生和老师之间的沟通,企业招聘不看这些哈 好好思考一下简历的设计和你要表达的重点,再去投简历
点赞 评论 收藏
分享
买蜜雪也用卷:我觉得应该没有哪个人敢说自己熟练使用git,代码分支一复杂还是得慢慢寻思一下的,不过基本的拉代码提交代码还有分支什么的是应该会
点赞 评论 收藏
分享
06-20 14:27
中山大学 C++
rt,day3就开始接需求
星际探神:你就想 你是水货他们都没面出来 他们也水 管他呢
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务