牛客网-两个链表生成相加链表

一、题目

在这里插入图片描述

二、思路

1、将两个链表反转,反转过程中记录链表长度;反转步骤为定义三个指针,前中后,每次往后移一个
2、交换两个反转后的链表,使链表1始终为最长的那个
3、两个链表开始相加,相加的结果放在链表1中,相加过程中用pos维护进位
4、相加完后再把链表反转回去

三、代码

/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 * };
 */

class Solution {
public:
    /**
     * 
     * @param head1 ListNode类 
     * @param head2 ListNode类 
     * @return ListNode类
     */
    ListNode* addInList(ListNode* head1, ListNode* head2) {
        ListNode *pre=nullptr;
        ListNode *cur=head1;
        ListNode *nxt=nullptr;
        int len1=0;
        int len2=0;

        while(cur)
        {
            len1++;
            nxt=cur->next;
            cur->next=pre;
            pre=cur;
            cur=nxt;
        }

        ListNode *first=nullptr;
        ListNode *second=head2;
        ListNode *third;

        while(second)
        {
            len2++;
            third=second->next;
            second->next=first;
            first=second;
            second=third;
        }

        int pos=0;
        //如果len1<len2,交换两个链表
        if(len1<len2)
        {
            swap(pre,first);
        }
        ListNode *p=pre;
            while(pre !=nullptr && first !=nullptr)
            {
                if((pre->val+first->val+pos)<10)
                {
                    pre->val=pre->val+first->val+pos;
                    pos=0;
                    pre=pre->next;
                    first=first->next;
                }
                else
                {
                    pre->val=pre->val+first->val+pos-10;
                    pos=1;
                    pre=pre->next;
                    first=first->next;
                }
            }
            while(pre !=nullptr )
            {
                if((pre->val+pos)<10)
                {
                    pre->val=pre->val+pos;
                    pos=0;
                    if(pre->next !=nullptr)
                    {
                        pre=pre->next;
                    }
                    else
                    {
                        break;
                    }
                }
                else
                {
                    pre->val=pre->val+pos-10;
                    pos=1;
                    if(pre->next !=nullptr)
                    {
                        pre=pre->next;
                    }
                    else
                    {
                        break;
                    }
                }
            }
        
        if(pos==1)
        {
            pre->next=new ListNode(1);
        }
        ListNode *n1=nullptr;
        ListNode *n2=p;
        ListNode *n3;
        while(n2)
        {
            n3=n2->next;
            n2->next=n1;
            n1=n2;
            n2=n3;
        }
        return n1;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值