有序的合并两个有序链表
来源:互联网 发布:淘宝隐藏优惠券app 编辑:程序博客网 时间:2024/05/08 00:52
输入两个递增链表,合并这两个链表中的元素,并保证合并后的链表中的节点仍然是递增排序的。
首先定义一个节点的结构体:
struct node{ int n_val; node *next; };
其次实现递增单链表的输入:即输入一系列递增的数字,并使它们形成一个链表。知道遇到”-1“,停止输入。
void create_list(node * &rhead){ node *pcur_node = NULL; node *ptemp_node = NULL; bool ishead= true; while(1) { if(ishead) { rhead = new node; cin>>rhead->n_val; if(-1 == rhead->n_val) { delete rhead; rhead =NULL; break; } else { rhead->next = NULL; ishead = false; pcur_node = rhead; } } else { ptemp_node = new node; cin>>ptemp_node->n_val; if(-1 == ptemp_node->n_val) { delete ptemp_node; ptemp_node = NULL; break; } else { ptemp_node->next = NULL; pcur_node->next = ptemp_node; pcur_node = ptemp_node; } } } }
合并两个链表:这里用到3个辅助指针,分别是list1的当前指针,list2的当前指针,以及合并后的list的当前指针。
node* merge_list(node* rhead1, node *rhead2){ if(NULL == rhead1) return rhead2; if(NULL == rhead2) return rhead1; node * cur_list1 = rhead1; node * cur_list2 = rhead2; node *head = NULL; if(cur_list1->n_val > cur_list2->n_val ) { head = cur_list2; cur_list2 = cur_list2->next; } else { head = cur_list1; cur_list1 = cur_list1->next; } node *temp = head; while(NULL != cur_list1 && NULL!=cur_list2) { if(cur_list1->n_val > cur_list2->n_val ) { temp->next = cur_list2; temp = cur_list2; cur_list2 = cur_list2->next; } else { temp->next = cur_list1; temp = cur_list1; cur_list1 = cur_list1->next; } } while(cur_list1 != NULL) { temp ->next = cur_list1; temp = cur_list1; cur_list1 = cur_list1->next; } while(cur_list2 != NULL) { temp ->next = cur_list2; temp = cur_list2; cur_list2 = cur_list2->next; } temp->next = NULL; return head; }
除了上面的函数外还需要定义链表的显示函数以及程序结束后对new的内存空间的delete的函数。
void display_list(node *phead){ if(NULL == phead) return; node *cur = phead; while(NULL != cur) { cout<<cur->n_val<<" "; cur = cur->next; } cout<<endl; } void delete_list(node *&rhead) { node *cur = rhead; while(NULL != cur) { node *temp = cur->next; delete cur; cur = temp; } cout<<endl; delete rhead; rhead = NULL; }
下面是main()函数
int main(){ node *head1; create_list(head1); display_list(head1); node *head2; create_list(head2); display_list(head2); node *head = merge_list(head1, head2); display_list(head); delete_list(head); return 0; }运行结果:
- 有序的合并两个有序链表
- 两个有序链表合并为有序
- 合并两个有序的链表为有序链表
- 两个有序链表的合并问题
- 合并两个有序链表的算法
- 实现两个有序链表的合并
- 合并两个有序的链表
- 算法:两个有序链表的合并
- 合并两个有序的链表
- 合并两个有序的链表
- 两个有序链表的合并
- 合并两个有序的链表
- 两个有序单向链表的合并
- 实现两个有序链表的合并
- 合并两个有序的链表
- 合并两个有序的链表
- 链表------两个有序链表的合并
- 两个有序链表序列的合并
- adb命令
- 为什么以太网帧的长度最短64字节,最长1518字节?
- 如何升级/编译Linux内核
- 10进制 VS 2进制
- POI导出excel中,导出图片可能出现的问题
- 有序的合并两个有序链表
- linux下热插拔事件的产生是怎样通知到用户空间,kobject_uevent_env之uevent
- pic2
- window下安装perl
- oracle 备份的语句
- 之前的android项目报错,新建android项目报错,代码中找不到错误 .
- 我对CONTAINING_RECORD宏的详细解释
- apk反编译查看*.java,AndroidManifest.xml,布局xml文件
- P3