/** * 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;//返回头指针,结束(水完,有要接着做了,库鲁西) } };