概述
关于合并两有序链表可以通过使用,原有链表空间进行合并,也可以通过创建新链表来进行合并。显然对比而言后者更易理解和实现。
下面将提供两种合并方法的代码。
(一)创建新链表合并。
#include <stdio.h>
#include <malloc.h>
//合并两张非递减有序链表
//以空间换时间多申请一个链表
//结点
typedef struct node
{
int data;
struct node *next;
}*Node, node;
//建立动态链表
Node creatlist(){
int n;
Node head,p,q;
head = (Node)malloc(sizeof(node));
q = head;
scanf("%d", &n);
while(n != -1){
p = (Node)malloc(sizeof(node));
p->data = n;
q->next = p;
q = p;
scanf("%d",&n);
}
q->next = NULL;
return head;
}
//合并两张非递减有序链表
Node merge(Node head1, Node head2){
Node p1,p2,p3,q3;
Node head3;
head3 = (Node)malloc(sizeof(node));
q3 = head3;
p1 = head1->next;
p2 = head2->next;
while(p1&&p2){
p3 = (Node)malloc(sizeof(node));
if(p1->data <= p2->data){
p3->data = p1->data;
q3->next = p3;
q3 = p3;
p1 = p1->next;
}else{
p3->data = p2->data;
q3->next = p3;
q3 = p3;
p2 = p2->next;
}
}
while (p1)
{
p3 = (Node)malloc(sizeof(node));
p3->data = p1->data;
q3->next = p3;
q3 = p3;
p1 = p1->next;
}
while (p2)
{
p3 = (Node)malloc(sizeof(node));
p3->data = p2->data;
q3->next = p3;
q3 = p3;
p2 = p2->next;
}
q3->next = NULL;
return head3;
}
void output(Node head){
while(head->next){
printf("%d ", head->next->data);
head = head->next;
}
}
int main(){
//创建链表(带头结点)
Node head1, head2, head3;
head1 = crt_list();
head2 = crt_list();
//合并递增链表
head3 = merge(head1, head2);
//输出链表
output(head1);
printf("n");
output(head2);
output(head3);
return 0;
}
(二)使用原有链表空间合并
#include <stdio.h>
#include <malloc.h>
//合并两张递增有序链表
//使用原空间
//结点
typedef struct node
{
int data;
struct node *next;
}*Node, node;
//创建链表
Node creatlist(){
int n;
Node head,p,q;
head = (Node)malloc(sizeof(node));
q = head;
scanf("%d", &n);
while(n != -1){
p = (Node)malloc(sizeof(node));
p->data = n;
q->next = p;
q = p;
scanf("%d",&n);
}
q->next = NULL;
return head;
}
//合并链表
Node merge(Node head1, Node head2){
Node pa = head1;
Node pb = head2->next;
Node p;
while(pa->next&&pb){
if(pb->data<=pa->next->data){
p = pb;
pb = pb->next;
p->next = pa->next;
pa->next = p;
pa = p->next;
} else{
pa = pa->next;
}
}
while (pb)
{
p = pb;
pb = pb->next;
p->next = pa->next;
pa->next = p;
pa = p;
}
return head1;
}
//输出链表
void output(Node head){
while(head->next){
printf("%d ", head->next->data);
head = head->next;
}
}
int main(){
Node head1;
Node head2;
Node head3;
//创建链表
head1 = creatlist();
head2 = creatlist();
//合并链表
head3 = merge(head1, head2);
//输出链表
output(head3);
}
以上就是两种不同的合并链表方式(欢迎在评论区点评和提问)。
最后
以上就是文静硬币为你收集整理的合并有序链表(使用原链表空间/创建新链表空间)的全部内容,希望文章能够帮你解决合并有序链表(使用原链表空间/创建新链表空间)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复