用visual Studio写一个c++程序将两个非递减的有序链表合并为一个非递增的有序链表。要求结果链表仍使用原来两个链表的存储空间,不另外占用其他的存储空间。表中允许有重复的数据。
时间: 2023-05-21 21:04:35 浏览: 105
以下是实现要求:
1.定义两个有序的链表head1和head2;
2.定义p1和p2指针分别指向head1 和 head2;
3.在定义一个新的指针p指向链表头,然后把两个链表中较小的值赋给p指针所指向的节点;
4.然后再把p指针所指向的节点指向它的下一个节点;
5.同时把p1或p2指向的节点也向它的下一个节点移动;
6.重复3到5,直到有一个链表为空;
7.把另一个非空的链表的剩余节点链到p指针的下一个节点;
8.返回指向新链表的头结点;
以下是代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
//定义链表节点结构体
typedef struct Node{
int data;
struct Node *next;
}Node,*pNode;
//函数声明
void printLinkList(pNode head); //打印链表
pNode mergeLinkList(pNode head1,pNode head2); //合并两个链表
int main()
{
//定义链表头结点1
pNode head1 = (pNode)malloc(sizeof(Node));
head1->next = NULL;
//创建有序链表1
pNode p1 = head1;
for(int i=1; i<=5; i++){
pNode temp = (pNode)malloc(sizeof(Node));
temp->data = i*5;
temp->next = NULL;
p1->next = temp;
p1 = temp;
}
printf("链表1:");
printLinkList(head1);
//定义链表头结点2
pNode head2 = (pNode)malloc(sizeof(Node));
head2->next = NULL;
//创建有序链表2
pNode p2 = head2;
for(int i=1; i<=5; i++){
pNode temp = (pNode)malloc(sizeof(Node));
temp->data = i*3;
temp->next = NULL;
p2->next = temp;
p2 = temp;
}
printf("链表2:");
printLinkList(head2);
//合并两个链表
pNode p = mergeLinkList(head1,head2);
printf("合并后的链表:");
printLinkList(p);
return 0;
}
//打印链表
void printLinkList(pNode head){
pNode p = head;
while(p->next != NULL){
printf("%d ",p->next->data);
p = p->next;
}
printf("\n");
}
//合并两个链表
pNode mergeLinkList(pNode head1,pNode head2){
pNode p1 = head1->next;
pNode p2 = head2->next;
//定义新链表头结点
pNode result = (pNode)malloc(sizeof(Node));
result->next = NULL;
//定义p指针,初始指向新链表头
pNode p = result;
while(p1!=NULL && p2!=NULL){
if(p1->data <= p2->data){
p->next = p1;
p1 = p1->next;
}
else{
p->next = p2;
p2 = p2->next;
}
p = p->next;
}
if(p1 != NULL) p->next = p1;
if(p2 != NULL) p->next = p2;
//释放head1和head2的空间
head1 = NULL;
head2 = NULL;
free(head1);
free(head2);
return result;
}
```
阅读全文