首页 单链表合并为有序链表

单链表合并为有序链表

举报
开通vip

单链表合并为有序链表单链表合并为有序链表 1、已知两个表链链head1和head2各自有序,把它合并成一链链链链链链链链 个表仍然有序,要求用链链链链链链链链链链链链 链链链方法。 #include #include struct Node { int num; Node *next; }; Node *Merge(Node *head1,Node *head2) { if(head1==NULL) return head2; if(head2==NULL) return head1; Node *head=NULL; if(he...

单链表合并为有序链表
单链 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 合并为有序链表 1、已知两个表链链head1和head2各自有序,把它合并成一链链链链链链链链 个表仍然有序,要求用链链链链链链链链链链链链 链链链方法。 #include #include struct Node { int num; Node *next; }; Node *Merge(Node *head1,Node *head2) { if(head1==NULL) return head2; if(head2==NULL) return head1; Node *head=NULL; if(head1->numnum) { head=head1; head->next=Merge(head1->next,head2); } else { head=head2; head->next=Merge(head1,head2->next); } return head; } 2、递增有序的2个并个数递递表合成一递增有序的递递表~不用任何递函递用 /* 递目描述: 2个你它两个并个递增有序的递递表~递把合成一有序 的递递表~分普通和不能用任何递函数2递方法 作者: xiaocui 递递: 2007.11.4 版本: v1.0 */ /* 递明: 如果采用一般的做法~直接申递新的空递~递成一新的个递递表~直接递行递就可以得到整的有序序列~递相递比递递递。并体个 如果不能用任何递函~也就是不能利用数malloc分配存~就是要利用内递有的2个递表~递行元素交递得到最后有序的递表。*/ #include using namespace std;/* 递递表递点 */ struct node { int value; node* next; }; /* 递递递表添加递点 */ void insertNode(node* head, int value) { node* p = head->next;if ( p == NULL ) { p = new node; p->value = value; p->next = NULL; head->next = p; return; } while ( p->next != NULL ){ p = p->next; } node* tmp = new node;tmp->value = value;tmp->next = NULL; p->next = tmp; } /* 遍递递出递表递点 */ void print(node* head){ node* p = head->next;while ( p != NULL ){ cout << p->value << " "; p = p->next; } cout << endl; } /* 利用一般的方法递行合~形成整递增有序 并体*/node* formalMerge(node* headA, node* headB) { node* head = new node;head->next = NULL;node* p = headA->next;node* q = headB->next;if ( p == NULL ) { return headB; } if ( q == NULL ) { return headA; } while ( (p != NULL) && (q != NULL) ) { if ( p->value == q->value ) { insertNode(head, p->value); insertNode(head, q->value); p = p->next; q = q->next; } else if ( p->value < q->value ) { insertNode(head, p->value); p = p->next; } else if ( p->value > q->value ) { insertNode(head, q->value); q = q->next; } } while ( p != NULL ) { insertNode(head, p->value); p = p->next; } while ( q != NULL ) { insertNode(head, q->value); q = q->next; } return head; } /* 下面递递不使用任何递函~ 利用交递的方法在原空递递递整有序。 方法是先定一递表数体确哪个 的第一递点的递小~把递递表的递递点作递合后递表的递递点~然后比递个个并2个当有序递表的前递点 的递~如果代表最后合递表的递小~递不用交递~否递把递交递~最后合递表始递保持递中并两个并两个 的小递。一递表由于交递了一元素~前元素可能影递递表的有序递增~递其递行递整使其保持另个个当响 递增有序~然后重递上述递作~直到一递表遍递递束~然后把剩余的递表递接起就行。个来*/ /* 递整递表的第一递点~使其递成递增有序 个*/void chg2sort(node* head, node* &p) { if (head->next == NULL ) //没有递点~直接返回{ return; } node* s = head; while ( s->next != p ) //s指向p的前一递点个{ s = s->next; } //下面的一段到第一大于找个p递点递的递点node* q = p; node* r = q; while ( q != NULL ){ if ( q->value <= p->value ) { r = q; //r始递指向q的前一递点个 q = q->next; } else { break; } } //下面递整指递~其递可以递一出~递了递递把写来清晰q递NULL和非NULL分递出写来 if ( q == NULL ){ r->next = p; s->next = p->next; p->next = NULL; } else if ( q != NULL ){ s->next = p->next; r->next = p; p->next = q; } //由于递表递行了递递~前递表指递也需要改递当 p = s->next; } /* 两个并有序递表递行合 */ node* merge(node* head1, node* head2) { node* head; //合后的递指递并 node* p = head1->next;node* q = head2->next;//有一递表递空的情~直接返回一递表个况另个 if ( p == NULL ) { head = head2; return head; } else if ( q == NULL ){ head = head1; return head; } //两个都不递空,先定递表作递合后的递表确哪个并 if ( (p != NULL) && (q != NULL) ) { if ( p->value < q->value ) { head = head1; } else { head = head2; } } node* p_prior; //始递指向p递点的前一递点个 node* q_prior; while ( (p != NULL) && (q != NULL) ) { if ( p ->value < q->value ) { if ( head == head1 ) { p_prior = p; p = p->next; } else if ( head == head2 ) { //递行前递点递的交递当 int tmp = p->value; p->value = q->value; q->value = tmp; chg2sort(head1, p); //交递元素后的递整 q_prior = q; q = q->next; } } else if ( p->value == q->value ) { p_prior = p; p = p->next; q_prior = q; q = q->next; } else if ( p->value > q->value ) { if ( head == head1 ) { int tmp = p->value; p->value = q->value; q->value = tmp; chg2sort(head2, q); p_prior = p; p = p->next; } else if ( head == head2 ) { q_prior = q; q = q->next; } } } if ( p != NULL ) { q_prior->next = p;} if ( q != NULL ) { p_prior->next = q;} return head; } int main() { /* 建立有序递表A */ int a[5] = {1, 5, 8, 10, 20};node* headA = new node;headA->next = NULL; for (int i = 0; i < 5; ++i){ insertNode(headA, a[i]);} print(headA); /* 建立有序递表B */ int b[3] = {3, 4, 9}; node* headB = new node;headB->next = NULL; for (int i = 0; i < 3; ++i){ insertNode(headB, b[i]);} print(headB); /* 利用递递合的方法合成整有序 并并体*/ node* head = formalMerge(headA, headB); print(head); int c[3] = {5, 4, 9}; node* headC = new node;headC->next = NULL; for (int i = 0; i < 3; ++i){ insertNode(headC, c[i]);} print(headC); //test chg2sort chg2sort(headC, headC->next);print(headC); head = merge(headA, headB);print(head); return 0; }
本文档为【单链表合并为有序链表】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_353097
暂无简介~
格式:doc
大小:26KB
软件:Word
页数:12
分类:生活休闲
上传时间:2017-11-14
浏览量:55