问题十一 :将两个递增的链表合并为一个递增的链表
问题十二 :将两个递增的链表合并为一个递减的链表,并用原来的两个单链表的节点存放归并后的单链表
问题十三 :将两个递增的链表A B的交集存放与A中
问题十四 :序列A B 存入了两个单链表,判断B是否是A的连续子序列 // 此处暴力枚举法 改进请参考KMP算法
问题十五 :删除倒数第n个节点
//问题十一 将两个递增的链表合并为一个递增的链表 void mergeList(LinkList &A,LinkList &B){ LNode *a=A->next,*b=B->next,*p=A; while(a!=NULL&&b!=NULL){ if(a->data<=b->data){ p->next=a; p=a; a=a->next; }else{ p->next=b; p=b; b=b->next; } } if(a) p->next=a; if(b) p->next=b; }
//问题十二 将两个递增的链表合并为一个递减的链表 // 并用原来的两个单链表的节点存放归并后的单链表 LinkList mergeList2(LinkList &A,LinkList &B){ LinkList C = (LinkList)malloc(sizeof(LNode)); C->next=NULL; LNode *a=A->next,*b=B->next,*p=A,*r; while(a!=NULL&&b!=NULL){ if(a->data<=b->data){ r=a->next; a->next=C->next; C->next=a; a=r; }else{ r=b->next; b->next = C->next; C->next=b; b=r; } } a = a==NULL?b:a; while(a){ r=a->next; a->next=C->next; C->next=a; a=r; } return C; }
// 问题十三 将两个递增的链表A B的交集存放与A中 LinkList Union(LinkList &A,LinkList &B){ LNode *a=A->next,*b=B->next,*p=A,*t; while(a!=NULL&&b!=NULL){ if(a->data==b->data){ p->next=a; p=a; a=a->next; t=b; b=b->next; free(t); }else if(a->data<b->data){ t=a; a=a->next; free(t); }else{ t=b; b=b->next; free(t); } } free(B); return A; }
// 问题十四 序列A B 存入了两个单链表,判断B是否是A的连续子序列 // 暴力枚举法 改进请参考KMP算法 LNode *isSubSeq(LinkList A,LinkList B){ LNode *a=A->next,*b=B->next; LNode *r=a; while(r){ a=r; b=B->next; while(a!=NULL&&b!=NULL&&a->data==b->data){ a=a->next; b=b->next; } if(b==NULL){ return r; //匹配成功 返回在A中成功匹配的第一个节点 } r=r->next; } return NULL; //匹配失败 返回NULL }
//删除倒数第n个节点 void delLastN(LinkList &L,int n){ LNode *r=L->next,*l=L->next; for(int i=1;i<n;i++){ r=r->next; } while(r->next->next!=NULL){ l=l->next; r=r->next; } l->next=l->next->next; }