两个链表生成相加链表:就是计算两个链表的和,并将结果中每一位作为链表的每一个节点值返回。
首先逐位相加应该从后从前加,因为可能产生进位,这种思想类似于大数加法的思路。如果本题返回的类型可以是数组或容器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;
}
};