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

C++——两个链表生成相加链表_第1张图片

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

首先逐位相加应该从后从前加,因为可能产生进位,这种思想类似于大数加法的思路。如果本题返回的类型可以是数组或容器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;
        stacks1;
        stacks2;
        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()val=sum%10;
        }
        if(flag>0)
        {
            ListNode* node=new ListNode(1);
            node->next=head1;
            return node;
        }
        return head1;
    }
};

 

你可能感兴趣的:(C++,相加链表,两个链表和,链表加法,C++)