将两递增链表合并,合并后的链表为递减的顺序
2012-11-29 14:38
176 查看
/* * author:王昌帅(山东科技大学) * email:415939252@qq.com * date :2012.11.29 */ #include <iostream> using namespace std; typedef struct LNode { int data; struct LNode* next; }LNode,*LinkList; //就地逆置 void reverse(LinkList &list) { LNode *p,*q,*r; if(list->next==NULL||list->next->next==NULL)//即没有元素或者只有一个元素 {return;} else if(list->next->next->next==NULL)//只有两个元素 { list->next->next->next=list->next; list->next=list->next->next; list->next->next->next = NULL; } else { p = list->next; q = p->next; r = q->next; p->next = NULL; //很重要!!! while(r) { q->next = p; p = q; q = r; r = r->next; } q->next = p; list->next = q; } } //两递增链表合并,并使合并后的链表递增 LinkList merge(LinkList list1,LinkList list2) { LinkList list,other; LNode *p,*q,*r; if(list1->next->data<list2->next->data) //判断哪一个链表的首节点数据大 { list = list1; other = list2; } else { list = list2; other = list1; } for(p=list->next,q = other->next;p->next&&q;) //将other链表中的元素按递增顺序合并到list表中 { if(p->next->data > q->data) { r = q->next; q->next = p->next; p->next = q; q = r; } p=p->next; } //连接上另一个链表的剩下的部分 if(q!=NULL) { p->next = q; } return list; } int main() { int i ,temp,num; LNode* node,*p; LinkList list,list1,list2; list1 = (LinkList)malloc(sizeof(LNode)); //头结点一定要开辟出来 list2 = (LinkList)malloc(sizeof(LNode)); //头结点一定要开辟出来 printf("请输入链表1中的元素个数:"); scanf("%d",&num); p = list1; for(i = 0;i<num;i++) { scanf("%d",&temp); node = (LNode*)malloc(sizeof(LNode)); node->data = temp; p->next = node; p = node; } p->next=NULL; printf("请输入链表2中的元素个数:"); scanf("%d",&num); p = list2; for(i = 0;i<num;i++) { scanf("%d",&temp); node = (LNode*)malloc(sizeof(LNode)); node->data = temp; p->next = node; p = node; } p->next=NULL; list = merge(list1,list2); //将两表合并并且仍按递增顺序 reverse(list); //将两表就地逆置 for(p=list->next;p;p = p->next) { printf(" %d",p->data); } printf("\n"); return 0; }
相关文章推荐
- 合并两个有序递增的链表,使得合并后新链表还是有序的
- 按非递减顺序合并两个单调递增集合
- 将一个递增和递减的有序链表,用原空间合并成递增有序的链表-O(n)复杂度
- 写程序。设ha和hb分别是两个带头结点的非递减有序单链表的头指针,试设计算法,将这两个有序链表合并成一个非递增有序的单链表。要求使用原链表空间,
- 将两个递增有序的单链表合并成一个递减有序的单链表,利用原结点空间
- 将两个递增有序的单链表合并成一个递减有序的单链表,利用原结点空间
- 将两个按元素值递增排序的单链表合并成一个按元素值递减的单链表
- 将两个非递减的有序链表合并为一个非递增的有序链表
- 将两个非递减的有序链表合并为一个非递增的有序链表
- 已知两个链表 la和 lb,其元素值递增排序。编程将la和lb合并成一个递减有序(相同值元素只保留一个)的链表lc。(北方名校经典试题) 本题选做
- 合并两个单调递增的链表,使得合并后的链表也是有序
- 将两个非递减的有序链表合并为一个非递增的有序链表(C语言编程实现)
- 将两个递增的链表合并成一个递减的链表(相同的元素只留下一个),并要求利用原表结点
- 将两个非递减的有序链表合并为一个非递增的有序链表(C语言编程实现)
- 剑指offer--合并两个递增链表
- 将两个递增的链表合并成一个递增的链表
- 合并两个链表,两个表的元素交叉进行,合并之后合并后的链表变成空表
- 基于顺序表的两个非递减有序表的合并
- 数组表示的线性表(顺序表)的基本操作,以及合并两个非递减数组线性表
- 两个递增有序链表合并为一个链表