数据结构实验之链表四:有序链表的归并

本文介绍了一种将两个有序链表合并成一个有序链表的方法。通过输入两个有序整数序列,建立相应的链表,然后合并输出。示例展示了完整的输入输出流程。

数据结构实验之链表四:有序链表的归并

Time Limit: 1000MS Memory Limit: 65536KB
Submit Statistic
Problem Description
分别输入两个有序的整数序列(分别包含M和N个数据),建立两个有序的单链表,将这两个有序单链表合并成为一个大的有序单链表,并依次输出合并后的单链表数据。
Input
第一行输入M与N的值; 
第二行依次输入M个有序的整数;
第三行依次输入N个有序的整数。
Output
输出合并后的单链表所包含的M+N个有序的整数。
Example Input
6 5
1 23 26 45 66 99
14 21 28 50 100
Example Output
1 14 21 23 26 28 45 50 66 99 100

01 #include <stdio.h>
02 #include <stdlib.h>
03 struct node
04 {
05     int data;
06     struct node *next;
07 };
08 struct nd
09 {
10     int data;
11     struct nd *next;
12 };
13 int main()
14 {
15     int i, n, m;
16     struct node *head, *p, *q, *tail;
17     struct nd *head1, *p1, *r;
18     head = (struct node *)malloc(sizeof(struct node));
19     head1 = (struct nd *)malloc(sizeof(struct nd));
20     head->next = NULL;
21     head1->next = NULL;
22     scanf("%d%d", &n, &m);
23     q = head;
24     for(i = 0;i<n;i++)
25     {
26        p = (struct node *)malloc(sizeof(struct node));
27        scanf("%d", &p->data);
28         p->next = q->next;
29         q->next = p;
30         q = p;
31     }
32     r = head1;
33     for(i = 0;i<m;i++)
34     {
35        p1 = (struct nd *)malloc(sizeof(struct nd));
36        scanf("%d", &p1->data);
37         p1->next = r->next;
38         r->next = p1;
39         r = p1;
40     }
41     q = head->next;r = head1->next;
42     head->next = NULL;
43     tail = head;
44     free(head1);
45     while(r&&q)
46     {
47         if(q->data < r->data)
48         {
49             tail->next = q;
50             tail = q;
51             q = q->next;
52             tail->next = NULL;
53         }
54  
55         else if(q->data >= r->data)
56         {
57             tail->next = r;
58             tail = r;
59             r = r->next;
60             tail->next = NULL;
61         }
62     }
63     if(q)
64     {
65         tail->next = q;
66     }
67     else
68         tail->next = r;
69     tail = head->next;
70     while(tail->next!=NULL)
71     {
72         printf("%d ", tail->data);
73         tail = tail->next;
74     }
75     printf("%d\n", tail->data);
76     return 0;
77 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值