/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
//我又呦呦呦又来水题解了(也算是做一下笔记吧)
//首先讲下这题主要思路,嗯,合并两个链表,其实本质上就是大整数求和,即,先遍历两个链表
//用两个数组存储链表中的元素(吐槽一下,这个数组有必要开那么大吗?意思一下不就行了),
//然后就是大整数求和那一套了,不会的同学自行复习数据结构哦,不过这题还有一个小考点就是最后链表要用头插法而不能用尾插法(小坑)。
class Solution {
public:
/**
*
* @param head1 ListNode类
* @param head2 ListNode类
* @return ListNode类
*/
ListNode* addInList(ListNode* head1, ListNode* head2) {
// write code here
int array1[1000001],array2[1000001],flag1=0,flag2=0;
ListNode *p=head1;
while(p)//遍历,存储元素
{
array1[flag1++]=p->val;
p=p->next;
}
p=head2;
while(p)//遍历,存储元素到数组中
{
array2[flag2++]=p->val;
p=p->next;
}
ListNode *NewHead=NULL;//这个就是我们要返回的链表头指针
int flag=0;//进位标志
flag1--;flag2--;
while(flag1>=0&&flag2>=0)//大整数求和,我就不讲了,百度or看书
{
int data=(array1[flag1]+array2[flag2]+flag)%10;
flag=(array1[flag1--]+array2[flag2--]+flag)/10;
ListNode *s=new ListNode(data);
s->next=NewHead;//头插法,因为我们是从最后开始加的嘛,所以你先加的肯定要排在最后嘛(想不通自己写两个柿子加一下)
NewHead=s;
}
while(flag1>=0)
{
int data=(array1[flag1]+flag)%10;
flag=(array1[flag1--]+flag)/10;
ListNode *s=new ListNode(data);
s->next=NewHead;
NewHead=s;
}
while(flag2>=0)
{
int data=(array2[flag2]+flag)%10;
flag=(array2[flag2--]+flag)/10;
ListNode *s=new ListNode(data);
s->next=NewHead;
NewHead=s;
}
if(flag==1)
{
ListNode *s=new ListNode(1);
s->next=NewHead;
NewHead=s;
return NewHead;
}
return NewHead;//返回头指针,结束(水完,有要接着做了,库鲁西)
}
};