2119数据结构实验之链表四:有序链表的归并
来源:互联网 发布:kettle java代码 编辑:程序博客网 时间:2024/06/03 20:31
数据结构实验之链表四:有序链表的归并
Problem Description
分别输入两个有序的整数序列(分别包含M和N个数据),建立两个有序的单链表,将这两个有序单链表合并成为一个大的有序单链表,并依次输出合并后的单链表数据。
Input
第一行输入M与N的值;
第二行依次输入M个有序的整数;
第三行依次输入N个有序的整数。
Output
输出合并后的单链表所包含的M+N个有序的整数。
Example Input
6 51 23 26 45 66 9914 21 28 50 100
Example Output
1 14 21 23 26 28 45 50 66 99 100
Hint
不得使用数组!
解题思路1
建立新链,将旧链上的数据通过中间节点t传递到新链上。
代码1
#include <stdio.h>#include <stdlib.h>typedef struct node { int data; struct node *next;}NODE;int main(){ NODE *L1 = (NODE *)malloc(sizeof(NODE)); NODE *L2 = (NODE *)malloc(sizeof(NODE)); NODE *L3 = (NODE *)malloc(sizeof(NODE)); L1->next = NULL; L2->next = NULL; L3->next = NULL; NODE *p=L1 ,*pa,*pb,*pc; int m, n; scanf("%d %d", &m, &n); while (m--)//新建链 { NODE *s = (NODE *)malloc(sizeof(NODE)); scanf("%d", &s->data); s->next = p->next; p->next = s; p = s; } p = L2; while (n--)//新建链 { NODE *s = (NODE *)malloc(sizeof(NODE)); scanf("%d", &s->data); s->next = p->next; p->next = s; p = s; } /*p = L1->next; while (p) { printf("%d ", p->data); p = p->next; } p = L2->next; while (p) { printf("%d ", p->data); p = p->next; }*/ pa = L1->next, pb = L2->next, pc = L3;//pa表示L1链的当前位置,pb表示L2链的当前位置,pc表示新链的当前位置 while (pa&&pb) { if (pa->data <= pb->data) { NODE *t = (NODE *)malloc(sizeof(NODE)); t->next = pc->next;//t是新链上的新节点 t->data = pa->data; pa = pa->next; pc->next = t; pc = t; } else if (pa->data > pb->data) { NODE *t = (NODE *)malloc(sizeof(NODE)); t->next = pc->next; t->data = pb->data; pb = pb->next; pc->next = t; pc = t; } } //对剩余链的处理 while (pa) { NODE *t = (NODE *)malloc(sizeof(NODE)); t->next = pc->next; t->data = pa->data; pa = pa->next; pc->next = t; pc = t; } while (pb) { NODE *t = (NODE *)malloc(sizeof(NODE)); t->next = pc->next; t->data = pb->data; pb = pb->next; pc->next = t; pc = t; } p = L3->next; while (p) { //printf("apple"); if (!p->next) printf("%d\n", p->data); else printf("%d ", p->data); p = p->next; } return 0;}
解题思路2
以第一条链的头结点L1为新链的头结点,按顺序将旧链上的节点链接上来。
代码2
#include <stdio.h>#include <stdlib.h>typedef struct node { int data; struct node *next;}NODE;int main(){ NODE *L1 = (NODE *)malloc(sizeof(NODE)); NODE *L2 = (NODE *)malloc(sizeof(NODE)); L1->next = NULL; L2->next = NULL; NODE *p=L1 ,*pa,*pb,*pc,*q; int m, n; scanf("%d %d", &m, &n); while (m--)//新建链 { NODE *s = (NODE *)malloc(sizeof(NODE)); scanf("%d", &s->data); s->next = p->next; p->next = s; p = s; } p=L2; while (n--)//新建链 { NODE *s = (NODE *)malloc(sizeof(NODE)); scanf("%d", &s->data); s->next = p->next; p->next = s; p = s; } /*p = L1->next; while (p) { printf("%d ", p->data); p = p->next; } p = L2->next; while (p) { printf("%d ", p->data); p = p->next; }*/ pa=L1->next; pb=L2->next; pc=L1; while(pa&&pb) { if(pa->data<=pb->data)//将pa指向的节点插入到pc的后面 { //pa->next=pc->next; pc->next=pa; pc=pa; pa=pa->next; } else //将pb指向的节点插入到pc的后面 { //pb->next=pc->next; pc->next=pb; pc=pb; pb=pb->next; } } //接下来剩余链处理 if(pa)//pa不为空的情况 { //pa->next=pc->next; pc->next=pa; } else//pb不为空的情况 { //printf("apple"); //pb->next=pc->next; pc->next=pb; } //接下来释放无用结点(另一个头结点即L2) free(L2); q=L1->next; while (q) { //printf("apple"); if (!q->next) printf("%d\n", q->data); else printf("%d ", q->data); q = q->next; } return 0;}
阅读全文
0 0
- 2119 数据结构实验之链表四:有序链表的归并
- 【2119】数据结构实验之链表四:有序链表的归并
- 【2119】数据结构实验之链表四:有序链表的归并
- 2119数据结构实验之链表四:有序链表的归并
- 2119数据结构实验之链表四:有序链表的归并
- 2119数据结构实验之链表四:有序链表的归并
- 2119 数据结构实验之链表四:有序链表的归并
- 数据结构实验之链表四:有序链表的归并
- 数据结构实验之链表四:有序链表的归并
- 数据结构实验之链表四:有序链表的归并
- 数据结构实验之链表四:有序链表的归并
- 数据结构实验之链表四:有序链表的归并
- 数据结构实验之链表四:有序链表的归并
- 数据结构实验之链表四:有序链表的归并
- 数据结构实验之链表四:有序链表的归并
- 数据结构实验之链表四:有序链表的归并
- 数据结构实验之链表四:有序链表的归并
- 数据结构实验之链表四:有序链表的归并
- bzoj3545[ONTAK2010]Peaks 线段树合并+离散
- LeetCode 599. Minimum Index Sum of Two Lists
- oracle 数据库 练习题2
- @font-face属性参数详细介绍
- 设计一个名为Account的类
- 2119数据结构实验之链表四:有序链表的归并
- 题目1007:奥运排序问题
- 手写svm识别人是否戴眼镜
- 619. Biggest Single Number--MAX()
- java定时任务调度工具之Timer
- spring boot hibernate 配置
- GTP6中文版 v6.0.7免费版
- jni的方法
- Spring--AOP学习