假设链表中每一个节点的值都在 0 - 9 之间,那么链表整体就可以代表一个整数。
给定两个这种链表,请生成代表两个整数相加值的结果链表。
数据范围:
,链表任意值 
要求:空间复杂度
,时间复杂度 )
要求:空间复杂度
例如:链表 1 为 9->3->7,链表 2 为 6->3,最后生成新的结果链表为 1->0->0->0。
[9,3,7],[6,3]
{1,0,0,0}
如题面解释
[0],[6,3]
{6,3}
/** * struct ListNode { * int val; * struct ListNode *next; * }; */ /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param head1 ListNode类 * @param head2 ListNode类 * @return ListNode类 */ #include <stdlib.h> int lenth(struct ListNode* p){ int num =0; while(p != NULL){ num++; p = p->next; } return num; } struct ListNode* addInList(struct ListNode* head1, struct ListNode* head2 ) { // write code here int len1, len2, i, j, min = 0; len1 = lenth(head1); len2 = lenth(head2); int* addend1 = (int*)calloc(len1, sizeof(int)); int* addend2 = (int*)calloc(len2, sizeof(int)); int* sum = (int*)calloc(len1+len2, sizeof(int)); struct ListNode* p1 = head1, *p2 = head2; //将两个加数放入对应数组 for(i = len1 - 1; i >= 0; i--){ addend1[i] = p1->val; p1 = p1->next; } for(i = len2 - 1; i >= 0; i--){ addend2[i] = p2->val; p2 = p2->next; } p1 = head1; p2 = head2; //合并两个链表 while(p1->next != NULL){ p1 = p1->next; } p1->next = p2; p1 = head1; //单个计算对应位加和放入sum数组 if(len1 <= len2){ min = len1; }else{ min = len2; } for(i = 0; i < min; i++){ sum[i] = addend1[i] + addend2[i]; } j = i; while(j != len1){ sum[j] = addend1[j]; j++; } j = i; while(j != len2){ sum[j] = addend2[j]; j++; } //遍历数组,若发现本位和/10 == 1 说明有进位flag,默认没有进位 int flag = 0; for(i = 0; i < len1 + len2; i++){ sum[i] += flag; if(sum[i] / 10 == 1){ flag = 1; sum[i] = sum[i] % 10; }else{ flag = 0; } } int dir = 0;//第一个不为0的位置(从0开始) i = len1 + len2 -1; while(i >= 0){ if(sum[i] == 0){ i--; }else{ dir = i; break; } } i = dir; while(i >= 0){ p1->val = sum[i]; if(i == 0){ p1->next = NULL; }else{ p1 = p1->next; } i--; } return head1; }
struct ListNode* ReverseList(struct ListNode* head ) { struct ListNode *p,*res; if((head==NULL) || (head->next==NULL)) return head; p = head->next; res = ReverseList(p); p->next = head; p->next->next = NULL; return res; } struct ListNode* addInList(struct ListNode* head1, struct ListNode* head2 ) { struct ListNode *p,*p1,*p2,*res=NULL; int carry=0; p1 = ReverseList(head1); p2 = ReverseList(head2); while(p1!=NULL || p2!=NULL) { int t; t = (p1==NULL?0:p1->val)+(p2==NULL?0:p2->val)+carry; if(t>9) { carry = t/10; t %= 10; } else carry = 0; if(res==NULL) { res = (struct ListNode *)malloc(sizeof(struct ListNode)); res->val = t; res->next = NULL; p = res; } else { struct ListNode *NewNode; NewNode = (struct ListNode *)malloc(sizeof(struct ListNode)); NewNode->val = t; NewNode->next = NULL; p->next = NewNode; p = p->next; } if(p1!=NULL) p1 = p1->next; if(p2!=NULL) p2 = p2->next; }; res = ReverseList(res); return res; }
struct ListNode*Reverse(struct ListNode* cur,struct ListNode*prev) { if(cur==NULL)return prev; struct ListNode *temp=NULL; temp=cur->next; cur->next=prev; return Reverse(temp,cur); } struct ListNode* addInList(struct ListNode* head1, struct ListNode* head2 ) { // write code here struct ListNode*p1=Reverse(head1,NULL); struct ListNode*p2=Reverse(head2,NULL); struct ListNode*ret=(struct ListNode*)malloc(sizeof(struct ListNode)); struct ListNode*p=ret; int count=0; while(p1!=NULL && p2!=NULL) { int temp=p1->val+p2->val+count; p1->val=p1->val+p2->val+count; if(p1->val>=10) { p1->val=p1->val-10; } count=temp/10; ret->next=p1; ret=ret->next; p1=p1->next; p2=p2->next; } struct ListNode* p3=p1?p1:p2; while(p3!=NULL) { int temp=p3->val+count; p3->val=p3->val+count; if(p3->val>=10) { p3->val=p3->val-10; } count=temp/10; ret->next=p3; p3=p3->next; ret=ret->next; } //缺少考虑count会带出来一个进位 struct ListNode*retu=NULL; if(1==count) { struct ListNode*temp1=p->next; struct ListNode*temp2=Reverse(temp1,NULL); p->val=count; p->next=temp2; retu=p; } else { //count没有进位的情况 struct ListNode*temp1=p->next; struct ListNode*temp2=Reverse(temp1,NULL); retu=temp2; } return retu; }
/** * struct ListNode { * int val; * struct ListNode *next; * }; */ /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param head1 ListNode类 * @param head2 ListNode类 * @return ListNode类 */ struct ListNode* ReverseList(struct ListNode* head ) { if (head == NULL) { return NULL; } struct ListNode* next = NULL; struct ListNode* prior = NULL; while (head != NULL){ next = head->next;//保存下一个节点 //头插法 head->next = prior; prior = head; head = next; } return prior ; } struct ListNode* addInList(struct ListNode* head1, struct ListNode* head2 ) { // write code here struct ListNode* p1 = ReverseList(head1); struct ListNode* p2 = ReverseList(head2); struct ListNode* res = NULL; struct ListNode* p = NULL; int i =0; while (p1!=NULL&&p2!=NULL) { p = (struct ListNode*)malloc(sizeof(struct ListNode)); p->next = res; if (p1->val+p2->val+i >= 10) { p->val = p1->val+p2->val+i-10; i = 1; }else { p->val = p1->val+p2->val+i; i = 0; } res = p; p1 = p1->next; p2 = p2->next; } p = NULL; while (p1!=NULL) { if (p1->val+i>=10) { p1->val = p1->val+i-10; i=1; }else { p1->val = p1->val+i; i = 0; } p = p1->next; p1->next = res; res = p1; p1 = p; } while (p2!=NULL) { if (p2->val+i>=10) { p2->val = p2->val+i-10; i=1; }else { p2->val = p2->val+i; i = 0; } p = p2->next; p2->next = res; res = p2; p2 = p; } if (i==1) { p = (struct ListNode*)malloc(sizeof(struct ListNode)); p->val = 1; p->next = res; res = p; } return res; }
#include <stdio.h> #include <stdlib.h> int ListLen(struct ListNode* p){ int rtn = 0; while(p!=NULL){ rtn = rtn+1; p = p->next; } return rtn; } bool ListAdd(struct ListNode* ans,struct ListNode* p1,struct ListNode* p2, int len1,int len2){ bool upper = false; if(ans!=NULL){ if(len1>=0){ ans->val += p1->val; p1 = p1->next; } if(len2>=0){ ans->val += p2->val; p2 = p2->next; } if(ListAdd(ans->next,p1,p2,len1+1,len2+1)){ ans->val+=1; } if(ans->val>=10){ ans->val -=10; return true; } } return false; } struct ListNode* addInList(struct ListNode* head1, struct ListNode* head2 ) { // write code here struct ListNode* rtn = malloc(sizeof(struct ListNode)*1); struct ListNode* tmp; int len1 = ListLen(head1); int len2 = ListLen(head2); int i,rlen; rlen = len1>len2?len1:len2; rtn->val = 0; rtn->next = NULL; tmp = rtn; for(i = 0;i < rlen;i++){ tmp->next = malloc(sizeof(struct ListNode)); tmp = tmp->next; tmp->val = 0; tmp->next = NULL; } ListAdd(rtn,head1,head2,len1-rlen-1,len2-rlen-1); if(rtn->val == 0){ return rtn->next; } return rtn; }
/** * struct ListNode { * int val; * struct ListNode *next; * }; */ /** * * @param head1 ListNode类 * @param head2 ListNode类 * @return ListNode类 */ #include <math.h> #include <stdio.h> #include <stdlib.h> struct ListNode* ReverseList(struct ListNode* pHead ); struct ListNode* addInList(struct ListNode* head1, struct ListNode* head2 ) { // write code here int i = 0; struct ListNode *Head1 = ReverseList(head1); struct ListNode *Head2 = ReverseList(head2); struct ListNode *p = (struct ListNode *)malloc( sizeof(struct ListNode) ); struct ListNode *n,*Head = p; p->next=NULL; while (Head1&&Head2) { n = (struct ListNode *)malloc( sizeof(struct ListNode) ); if((Head1->val + Head2->val + i)>=10) { n->val=(Head1->val + Head2->val + i)-10; i=1; } else { n->val=(Head1->val + Head2->val + i); i=0; } n->next=NULL; p->next=n; p=n; Head1 = Head1->next; Head2 = Head2->next; } if (i==0) { if (Head1) { p->next=Head1; } else if (Head2){ p->next=Head2; } else; } while (Head1&&i) { n = (struct ListNode *)malloc( sizeof(struct ListNode) ); if((Head1->val + i)>=10) { n->val=(Head1->val + i)-10; i=1; n->next=NULL; p->next=n; p=n; Head1 = Head1->next; } else { n->val=(Head1->val + i); i=0; p->next=n; p=n; p->next=Head1->next; } } while (Head2&&i) { n = (struct ListNode *)malloc( sizeof(struct ListNode) ); if((Head2->val + i)>=10) { n->val=(Head2->val + i)-10; i=1; n->next=NULL; p->next = n; p = n; Head2 = Head2->next; } else { n->val=(Head2->val + i); i=0; p->next=n; p=n; p->next=Head2->next; } } if (i==1) { n = (struct ListNode *)malloc( sizeof(struct ListNode) ); n->val=1; n->next=NULL; p->next = n; p = n; } return ReverseList(Head->next); } struct ListNode* ReverseList(struct ListNode* pHead ) { // write code here if(pHead==NULL||pHead->next==NULL){ return pHead; } struct ListNode *cur = NULL; cur = pHead; struct ListNode *pre = NULL; struct ListNode *temp; while (cur) { temp = cur->next; cur->next=pre; pre = cur; cur = temp; } return pre; }
#include <stdio.h> //翻转链表 struct ListNode* reverse(struct ListNode* head){ struct ListNode* cur = head; struct ListNode* pre = NULL; struct ListNode* nex = head->next; while(cur) { cur->next = pre; pre = cur; cur = nex; nex = cur->next; } return pre; } //链表相加 struct ListNode* addTwoNumbers(struct ListNode* head1, struct ListNode* head2){ struct ListNode* l1 = head1; struct ListNode* l2 = head2; struct ListNode* tail; int n = 1; int sum = 0; while (l1 && l2) { sum += (l1->val + l2->val) * n; l1=l1->next; l2=l2->next; n=n*10; } while (l1==NULL && l2!=NULL) { sum += l2->val * n; l2=l2->next; n=n*10; } while (l1!=NULL && l2==NULL) { sum += l1->val * n; l1=l1->next; n=n*10; } // 头指针c struct ListNode* c = NULL; while (sum>=1) { struct ListNode* p = (struct ListNode*)malloc(sizeof(struct ListNode)); p->val = sum % 10; p->next = c; c = p; sum = sum/10; } return c; } struct ListNode* addInList(struct ListNode* head1, struct ListNode* head2 ) { // write code here if (head1->val==0) { return head2; } if (head2->val==0) { return head1; } if (head1->next) { head1 = reverse(head1); } if (head2->next) { head2 = reverse(head2); } struct ListNode* head3; head3 = addTwoNumbers(head1, head2); return head3; }
#include <stdlib.h> struct ListNode* addInList(struct ListNode* head1, struct ListNode* head2 ) { // write code here struct ListNode* p = (struct ListNode*)malloc(sizeof(struct ListNode)); struct ListNode* q = (struct ListNode*)malloc(sizeof(struct ListNode)); struct ListNode* head = (struct ListNode*)malloc(sizeof(struct ListNode)); struct ListNode* tmp; int sum = 0; //当前位 int flage = 0; //进位符号位 head->next = NULL; p->next = NULL; q->next = NULL; //头插法逆置两个链表 while (head1 != NULL) { tmp = head1; head1 = head1->next; tmp->next = p->next; p->next = tmp; } p = p->next; while (head2 != NULL) { tmp = head2; head2 = head2->next; tmp->next = q->next; q->next = tmp; } q = q->next; while (1) { if(q != NULL && p != NULL) { sum = q->val + p->val + flage; //低位 符号位 相加 flage = sum >= 10 ? 1 : 0; //判断是否进位 sum %= 10; //进位后 p = p->next; q = q->next; } else if (q != NULL && p == NULL) { sum = q->val + flage; flage = sum >= 10 ? 1 : 0; sum %= 10; q = q->next; } else if (q == NULL && p != NULL) { sum = p->val + flage; flage = sum >= 10 ? 1 : 0; sum %= 10; p = p->next; } else if(q == NULL && p == NULL && flage == 1) { sum = 1; //最高位只有进位 flage = 0; } else { break; } //头插法插入 每一位的结果sum struct ListNode* new = (struct ListNode*)malloc(sizeof(struct ListNode)); new->val = sum; new->next = head->next; head->next = new; } return head->next; }
struct ListNode* reverse(struct ListNode* head){ struct ListNode* p1 = head->next; struct ListNode* p2 = p1->next; head->next = NULL; while(p1){ p1->next = head; head = p1; p1 = p2; if(p1) p2 = p1->next; } return head; } struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){ struct ListNode* head1 = l1; struct ListNode* head2 = l2; struct ListNode* tail; while(head1 && head2){ tail = head1; head1->val = head1->val + head2->val; if(head1->val >= 10 && head1->next){ head1->val %= 10; head1->next->val++; } else if(head1->val >= 10 && head2->next){ head1->val %= 10; head2->next->val++; head1->next = head2->next; head2->next = NULL; } else if(head1->val >= 10){ head1->val %= 10; l2->val = 1; tail->next = l2; l2->next = NULL; } head1 = head1->next; head2 = head2->next; } while(head1){ if(head1->val >= 10){ head1->val %= 10; if(head1->next) head1->next->val++; else{ l2->val = 1; head1->next = l2; l2->next = NULL; } } head1 = head1->next; } while(head2) { tail->next = head2; head2 = NULL; } return l1; } struct ListNode* addInList(struct ListNode* head1, struct ListNode* head2 ){ if(head1->val == 0) return head2; if(head2->val == 0) return head1; if(head1->next) head1 = reverse(head1);//逆置 if(head2->next) head2 = reverse(head2);//逆置 struct ListNode* head3; head3 = addTwoNumbers(head1, head2);//相加 if(head3->next) head3 = reverse(head3);//结果逆置回来 return head3; }
typedef struct ListNode* pnode; // 将两个链表的值求和 void mycombine(pnode head1,pnode head2,int len1,int len2){ pnode p=head1; pnode q=head2; while(len1>len2){ p=p->next; len1--; }//保持后对齐 while(p){ p->val+=q->val; p=p->next; q=q->next; } } int carrybit(pnode head){ //实现进位操作 if(head==NULL)return 0; head->val+=carrybit(head->next); if(head->val>=10){ head->val-=10; return 1; }else return 0; } int mystrlen(pnode head){//计算链表得长度 int count=0; while(head){ head=head->next; count++; } return count; } struct ListNode* addInList(struct ListNode* head1, struct ListNode* head2 ) { if(head1==NULL) return head1; if(head2==NULL) return head2; int len1=mystrlen(head1); int len2=mystrlen(head2); pnode temp=NULL; //找到较大的链表,求和得到的放入其中; if(len1>=len2){ temp=head1; mycombine(temp,head2,len1,len2);//两个链表的值加到temp里 }else{ temp=head2; mycombine(temp,head1,len2,len1);//两个链表的值加到temp里 } int i=carrybit(temp); if(i==1){ pnode newhead=(pnode)malloc(sizeof(struct ListNode)); newhead->val=1; newhead->next=temp; temp=newhead; } return temp; }
struct ListNode* ReverseList(struct ListNode* pHead ) { struct ListNode *p = pHead; struct ListNode *q = NULL; struct ListNode *temp = NULL; while(p) { temp = q; q = p; p = p->next; q->next = temp; } // write code here return q; } /** * * @param head1 ListNode类 * @param head2 ListNode类 * @return ListNode类 */ struct ListNode* addInList(struct ListNode* head1, struct ListNode* head2 ) { struct ListNode *p = ReverseList(head1); struct ListNode *newhead = p; struct ListNode *q = ReverseList(head2); struct ListNode *temp = NULL; int jin = 0; while(p && q) { if(p->val + q->val + jin <= 9) { p->val = p->val + q->val + jin; jin = 0; } else { p->val = (p->val + q->val +jin)%10; jin = 1; } temp = p; p = p->next; q = q->next; } while(p || q || jin) { if(p) { if(p->val +jin <= 9) { p->val = p->val +jin; jin = 0; } else { p->val = 0; jin = 1; } temp = p; p = p->next; } else if(q) { struct ListNode * newp = (struct ListNode *)malloc(sizeof(struct ListNode)); temp->next = newp; // 最后一个结点的下一个 是 新结点 newp->next = NULL; if(q->val +jin <= 9) { newp->val = q->val +jin; jin = 0; } else { newp->val = 0; jin = 1; } temp = newp; q = q->next; } else if(jin) { struct ListNode * newp = (struct ListNode *)malloc(sizeof(struct ListNode)); temp->next = newp; // 最后一个结点的下一个 是 新结点 newp->next = NULL; newp->val = jin; jin = 0; } } return ReverseList(newhead); // write code here }
int Recursion(struct ListNode* head1,struct ListNode* head2,int cout); int LengthListNode(struct ListNode* pHead); struct ListNode* addInList(struct ListNode* head1, struct ListNode* head2) { // write code here int len1=LengthListNode(head1); int len2=LengthListNode(head2); int sub=len1>len2?len1-len2:len2-len1; struct ListNode* nh=(struct ListNode*)malloc(sizeof(struct ListNode)); int cout=0; if(sub==0){ cout=Recursion(head1,head2,0);; if(cout!=0){ nh->next=head1;nh->val=cout; return nh; }else{ return head1; } } struct ListNode* sp=0; struct ListNode* ep=0; while(sub){ //补零序列 ep=(struct ListNode*)malloc(sizeof(struct ListNode));ep->val=0; ep->next=sp;sp=ep;sub=sub-1; } //ep指向零结点的最后结点 ep=sp; while(ep->next!=0){ ep=ep->next; } //连接上长度小的头结点 if(len1>len2){ ep->next=head2; cout=Recursion(sp,head1,0); //存在sp中 }else{ ep->next=head1; cout=Recursion(sp,head2,0); //存在sp中 } //根据cout来进行输出 if(cout!=0){ //存在进位 nh->val=cout;nh->next=sp; return nh; }else{ //不存在进位 return sp; } } int LengthListNode(struct ListNode* pHead){ int data=0; while(pHead!=0){ pHead=pHead->next;data++; } return data; } int Recursion(struct ListNode* head1,struct ListNode* head2,int cout){ if(head1->next==0&&head2->next==0){ int result=head1->val+head2->val+cout; head1->val=result%10; return result/10; } int ct=Recursion(head1->next,head2->next,cout); int result=head1->val+head2->val+ct; head1->val=result%10; return result/10; }
/** * struct ListNode { * int val; * struct ListNode *next; * }; * * C语言声明定义全局变量请加上static,防止重复定义 */ /** * * @param head1 ListNode类 * @param head2 ListNode类 * @return ListNode类 */ #先反转链表,再竖式相加 #include<stdlib.h> struct ListNode * reverseListnode(struct ListNode *head) { struct ListNode *p, *q, *temp; if(head ==NULL) return NULL; if(head->next == NULL) return head; p = head; q = head->next; head->next = NULL; while(q != NULL) { temp = q->next; q->next = p; p = q; q = temp; } return p; } struct ListNode* addInList(struct ListNode* head1, struct ListNode* head2 ) { // write code here if(head1 == NULL && head2 == NULL) return NULL; struct ListNode *tail1, *tail2; tail1 = reverseListnode(head1); tail2 = reverseListnode(head2); int flag=0; struct ListNode *p, *q, *head, *temp; p = tail1; q = tail2; temp = NULL; while(p != NULL && q != NULL) { head = (struct ListNode *) malloc(sizeof(struct ListNode)); head->val = p->val + q->val; if(flag) { head->val ++; flag = 0; } if(head->val > 9) { head->val = head ->val -10; flag = 1; } head->next = temp; temp = head; p = p->next; q = q->next; } while(p != NULL) { head = (struct ListNode *) malloc(sizeof(struct ListNode)); head->val = p->val; if(flag) { head->val ++; flag = 0; } if(head->val > 9) { head->val = head ->val -10; flag = 1; } head->next = temp; temp = head; p = p->next; } while(q != NULL) { head = (struct ListNode *) malloc(sizeof(struct ListNode)); head->val = q->val; if(flag) { head->val ++; flag = 0; } if(head->val > 9) { head->val = head ->val -10; flag = 1; } head->next = temp; temp = head; q = q->next; } if(flag) { head = (struct ListNode *) malloc(sizeof(struct ListNode)); head->val = 1; head->next = temp; } tail1->next = NULL; tail2->next = NULL; return head; }
struct ListNode* addInList(struct ListNode* head1, struct ListNode* head2 ) { //相加是从低位向高位进位 设置一个进位表示CFlag //用头插法改变读取顺序 再在第二次复原时使用头插法恢复 int i,j,k; struct ListNode *p1,*p2,*head3,*newnode,*work1,*work2; int Cflag=0; i=0;j=0; p1=head1;p2=head2; while(p1!=NULL){ i++;p1=p1->next; } while(p2!=NULL){ j++;p2=p2->next; } p1=head1;p2=head2; head3=NULL; newnode=(struct ListNode*)malloc(sizeof(struct ListNode)); if(i>j){ k=i-j; while(k!=0){ newnode->val=p1->val; p1=p1->next; newnode->next=head3; head3=newnode; newnode=(struct ListNode*)malloc(sizeof(struct ListNode)); k--; }} if(j>i){ k=j-i; while(k!=0){ newnode->val=p2->val; p2=p2->next; newnode->next=head3; head3=newnode; newnode=(struct ListNode*)malloc(sizeof(struct ListNode)); k--; }} while(p1&&p2){ newnode->val=p1->val+p2->val; newnode->next=head3; head3=newnode; newnode=(struct ListNode*)malloc(sizeof(struct ListNode)); p1=p1->next;p2=p2->next; } //逆置的链表生成了 使用Cflag记录进位 使用头插再次逆置; work1=head3; head3=NULL; while(work1){ if(Cflag==1){ work1->val+=1; Cflag=0; } if(work1->val>9){ work1->val=work1->val%10; Cflag=1; } work2=work1->next; work1->next=head3; head3=work1; work1=work2; } if(Cflag){ newnode->val=1; newnode->next=head3; head3=newnode; } return head3; }