题解 | #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;
}
};
曼迪匹艾公司福利 95人发布