7-51 两个有序链表序列的合并 (20分)

 1 #include <iostream>
 2 using namespace std;
 3 typedef struct node
 4 {
 5     int id;
 6     struct node* next;
 7 }*L;
 8 int main()
 9 {
10     L l1=NULL, l2=NULL, l3=NULL;//三个链表
11     int cnt = 0;//结点总数
12     int in;//输入的数据
13   L p = NULL;//临时保存链表头
14     while (1)
15     {
16     scanf("%d",&in);
17         if (in == -1)break;
18         cnt++;
19         if (NULL == l1)
20         {
21             l1 = new struct node;
22             l1->id = in;
23             l1->next = NULL;
24       p = l1;
25         }
26         else
27         {
28             struct node* s = new struct node;
29             s->next = NULL;
30             s->id = in;
31             l1->next = s;
32       l1=l1->next;
33         }
34     }
35   l1=p;
36     while (1)
37     {
38         cin >> in;
39         if (in == -1)break;
40         cnt++;
41         if (NULL == l2)
42         {
43             l2 = new struct node;
44             l2->id = in;
45             l2->next = NULL;
46       p=l2;
47         }
48         else
49         {
50             struct node* s = new struct node;
51             s->next = NULL;
52             s->id = in;
53             l2->next = s;
54       l2 = l2->next;
55         }
56     }    
57   l2=p;
58     p=NULL;
59     for (int i = 0; i < cnt; i++)
60     {
61         struct node* s = new struct node;
62         s->next = NULL;
63         if (!l3)
64         {
65             l3= s;
66             p = l3;
67         }
68         else
69         {
70             l3->next = s; 
71       l3=l3->next;
72         }
73     }
74     l3 = p;
75     while (l1 || l2)
76     {
77         if (((l1 && l2) &&(l1->id < l2->id)) || (l1 && !l2))
78         {
79             l3->id = l1->id;    
80             printf("%d", l3->id);
81             l1 = l1->next;
82             l3 = l3->next;
83         }
84         else if (((l1 && l2) && (l1->id >= l2->id)) || (!l1 && l2))
85         {
86             l3->id = l2->id;
87             printf("%d", l3->id);
88             l2 = l2->next;
89             l3 = l3->next;
90         }
91         if (NULL != l2 || NULL != l1)
92             printf(" ");
93     }
94     l3 = p;
95     if (!l3)printf("NULL");
96     return 0;
97 }

 

以下是使用C语言实现合并两个有序链表序列的代码: ```c #include <stdio.h> #include <stdlib.h> // 定义链表结构体 typedef struct Node { int value; // 值 struct Node *next; // 指向下一个节点的指针 } Node; // 合并两个有序链表 Node *mergeLists(Node *list1, Node *list2) { Node *head = NULL; // 合并链表的头节点 Node *tail = NULL; // 合并链表的尾节点 // 如果有一个链表为空,则直接返回另一个链表 if (list1 == NULL) { return list2; } else if (list2 == NULL) { return list1; } // 选择头节点 if (list1->value < list2->value) { head = list1; list1 = list1->next; } else { head = list2; list2 = list2->next; } tail = head; // 循环合并两个链表 while (list1 != NULL && list2 != NULL) { if (list1->value < list2->value) { tail->next = list1; list1 = list1->next; } else { tail->next = list2; list2 = list2->next; } tail = tail->next; } // 将剩余的节点添加到尾部 if (list1 != NULL) { tail->next = list1; } else { tail->next = list2; } return head; } // 打印链表 void printList(Node *list) { while (list != NULL) { printf("%d ", list->value); list = list->next; } printf("\n"); } int main() { // 创建两个有序链表 Node *list1 = (Node *) malloc(sizeof(Node)); list1->value = 1; list1->next = (Node *) malloc(sizeof(Node)); list1->next->value = 3; list1->next->next = (Node *) malloc(sizeof(Node)); list1->next->next->value = 5; list1->next->next->next = NULL; Node *list2 = (Node *) malloc(sizeof(Node)); list2->value = 2; list2->next = (Node *) malloc(sizeof(Node)); list2->next->value = 4; list2->next->next = (Node *) malloc(sizeof(Node)); list2->next->next->value = 6; list2->next->next->next = NULL; // 合并两个有序链表 Node *mergedList = mergeLists(list1, list2); // 打印合并后的链表 printList(mergedList); return 0; } ``` 输出结果为: ``` 1 2 3 4 5 6 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值