C++——两个链表生成相加链表

两个链表生成相加链表:就是计算两个链表的和,并将结果中每一位作为链表的每一个节点值返回。

首先逐位相加应该从后从前加,因为可能产生进位,这种思想类似于大数加法的思路。如果本题返回的类型可以是数组或容器vector,就会简单很多,我们只需要获取两个链表的每一位数据存储到数组中,就可以实现逐位相加并保存,但是本题是返回一个链表,所以在处理过程中需要考虑如何将结果放入到一个链表中,或者在计算的过程中我们利用已经存在的链表进行值替换,值替换是比较容易操作的

首先我们从后向前进行加法,因此我们考虑用栈遍历保存两个链表的节点,在出栈的过程中进行计算和值替换,在大数加法中,我们将得到的结果值直接在较长的字符串中进行替换,参考这种思想,我们可以判断两个栈的大小,将大的栈的栈顶节点作为返回的头节点,对于相加得到的结果,我们需要判断是否产生进位,用flag作为进位标志位,对10进行取整就是标志位的值,对10取余就是该节点的值。循环上述操作,直到两个栈都为空,则此时的头节点就是最后计算的结果的第一位。(前提是最高位没有产生进位)  若最高位产生进位,即最后要判断flag是否大于0,若是产生进位,则相加链表的头节点需要插入一个值为1的节点,然后返回该节点。否则直接返回头节点。

代码如下:

class Solution {
public:
    /**
     * 
     * @param head1 ListNode类 
     * @param head2 ListNode类 
     * @return ListNode类
     */
    ListNode* addInList(ListNode* head1, ListNode* head2) {
        // write code here
        if(head1==nullptr) return head2;
        if(head2==nullptr) return head1;
        stack<ListNode*>s1;
        stack<ListNode*>s2;
        while(head1!=nullptr)
        {
            s1.push(head1);
            head1=head1->next;
        }
        while(head2!=nullptr)
        {
            s2.push(head2);
            head2=head2->next;
        }
        int flag=0;
        while(!s1.empty()||!s2.empty())
        {
            int sum=flag;
            if(!s1.empty())
            {
                sum+=s1.top()->val;
                head1=s1.top();
                s1.pop();
            }
            if(!s2.empty())
            {
                sum+=s2.top()->val;
                if(s1.size()<s2.size())
                    head1=s2.top();
                s2.pop();
            }
            flag=sum/10;
            head1->val=sum%10;
        }
        if(flag>0)
        {
            ListNode* node=new ListNode(1);
            node->next=head1;
            return node;
        }
        return head1;
    }
};

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
链表中的两数相加是一个经典的问题,我们可以通过遍历链表并进行逐位相加来解决。具体的步骤如下: 1. 定义一个新的链表作为结果的头结点,并初始化为空。 2. 定义两个指针分别指向两个链表的头结点,以及一个进位变量carry,初始值为0。 3. 遍历两个链表,直到两个链表都遍历完。 4. 在每个节点上,将两个链表对应位置的值相加,并加上进位值carry。 5. 计算当前位置的值以及进位值,更新结果链表以及进位值。 6. 如果某个链表已经遍历完,但另一个链表还有剩余节点,则将剩余节点的值与进位值相加,并更新结果链表。 7. 如果最后一个节点的相加结果产生了进位,则在结果链表末尾添加一个值为1的新节点。 8. 返回结果链表的头结点。 下面是C++代码实现: ```cpp struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} }; ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { ListNode* dummy = new ListNode(0); ListNode* curr = dummy; int carry = 0; while (l1 || l2) { int x = (l1) ? l1->val : 0; int y = (l2) ? l2->val : 0; int sum = carry + x + y; carry = sum / 10; curr->next = new ListNode(sum % 10); if (l1) l1 = l1->next; if (l2) l2 = l2->next; curr = curr->next; } if (carry > 0) { curr->next = new ListNode(carry); } return dummy->next; } ``` 这个算法的时间复杂度是O(max(m, n)),其中m和n分别是两个链表的长度。空间复杂度是O(max(m, n)),用于存储结果链表
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值