两个升序链表合成一个升序链

// 另立新链

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
typedef int elemtype;
typedef struct node
{
elemtype data;
struct node* next;
}linklist;
linklist* creatlinklist()
{
linklist *head,*p,*r;
head=(linklist*)malloc(sizeof(linklist));
head->next=NULL;
r=head;
int x;
scanf("%d",&x);
while(x!=-1)
{
   p=(linklist*)malloc(sizeof(linklist));
   p->data=x;
   p->next=NULL;
   r->next=p;
   r=p;  
   scanf("%d",&x);
}
return head;
}
linklist* connect(linklist* ha,linklist* hb)
{
linklist *pa=ha->next;
linklist *pb=hb->next;
linklist *hc,*p,*r;
hc=(linklist*)malloc(sizeof(linklist));

hc->next=NULL;
r=hc;

while(pa&&pb)
{
   if(pa->data<pb->data)
   {
    p=(linklist*)malloc(sizeof(linklist));
    p->data=pa->data;
    r->next=p;
    r=r->next;

    pa=pa->next;
   }
   else if(pa->data>pb->data)
   {
    p=(linklist*)malloc(sizeof(linklist));
    p->data=pb->data;
    r->next=p;
    r=r->next;

    pb=pb->next;
   }
   else if(pa->data==pb->data)
   {
    p=(linklist*)malloc(sizeof(linklist));
    p->data=pa->data;
    r->next=p;
    r=r->next;
    pa=pa->next;

    p=(linklist*)malloc(sizeof(linklist));
    p->data=pb->data;
    r->next=p;
    r=r->next;
    pb=pb->next;
   }
}
while(pa)
{
   p=(linklist*)malloc(sizeof(linklist));
   p->data=pa->data;
   r->next=p;
   r=r->next;
   pa=pa->next;
}
while(pb)
{
   p=(linklist*)malloc(sizeof(linklist));
   p->data=pb->data;
   r->next=p;
   r=r->next;
   pb=pb->next;
}
p->next=NULL;
return hc;
}
void print(linklist *head)
{
linklist *p=head->next;
while(p)
{
   printf("%d->",p->data);
   p=p->next;
}
return;
}
int main()
{
linklist *ha=creatlinklist();

linklist *hb=creatlinklist();

linklist *hc=connect(ha,hb);

print(hc);

return 0;
}

//不申请额外空间

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
typedef int elemtype;
typedef struct node
{
elemtype data;
struct node* next;
}linklist;
linklist* creatlinklist()
{
linklist *head,*p,*r;
head=(linklist*)malloc(sizeof(linklist));
head->next=NULL;
r=head;
int x;
scanf("%d",&x);
while(x!=-1)
{
   p=(linklist*)malloc(sizeof(linklist));
   p->data=x;
   p->next=NULL;
   r->next=p;
   r=p;  
   scanf("%d",&x);
}
return head;
}
linklist* connect(linklist* ha,linklist* hb)
{
linklist *pa=ha->next;
linklist *pb=hb->next;
linklist *hc,*p,*r;
hc=(linklist*)malloc(sizeof(linklist));
hc->next=NULL;
r=hc;

while(pa&&pb)
{
   if(pa->data<pb->data)
   {
    r->next=pa;
    r=pa;
    pa=pa->next;
   }
   else if(pa->data>pb->data)
   {
    r->next=pb;
    r=pb;
    pb=pb->next;
   }
   else if(pa->data==pb->data)
   {
    r->next=pa;
    r=pa;
    r->next=pb;
    r=pb;
    pa=pa->next;
    pb=pb->next;
   }
}
while(pa)
{
   r->next=pa;
   r=pa;
   pa=pa->next;
}
while(pb)
{
   r->next=pb;
   r=pb;
   pb=pb->next;
}
r->next=NULL;
return hc;
}
void print(linklist *head)
{
linklist *p=head->next;
while(p)
{
   printf("%d->",p->data);
   p=p->next;
}
return;
}
int main()
{
linklist *ha=creatlinklist();

linklist *hb=creatlinklist();

linklist *hc=connect(ha,hb);

print(hc);

return 0;
}

好的,这是一个关于编程的问题。可以使用归并排序的思想,将两个升序排列的链表合并成一个降序排列的链表。具体实现可以参考以下代码: ```c #include <stdio.h> #include <stdlib.h> typedef struct ListNode { int val; struct ListNode* next; } ListNode; ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { if (l1 == NULL) { return l2; } if (l2 == NULL) { return l1; } if (l1->val < l2->val) { l1->next = mergeTwoLists(l1->next, l2); return l1; } else { l2->next = mergeTwoLists(l1, l2->next); return l2; } } ListNode* reverseList(ListNode* head) { ListNode* prev = NULL; ListNode* curr = head; while (curr != NULL) { ListNode* next = curr->next; curr->next = prev; prev = curr; curr = next; } return prev; } ListNode* mergeSortedList(ListNode* l1, ListNode* l2) { ListNode* mergedList = mergeTwoLists(l1, l2); ListNode* reversedList = reverseList(mergedList); return reversedList; } int main() { // 创建两个升序排列的链表 ListNode* l1 = (ListNode*)malloc(sizeof(ListNode)); l1->val = 1; l1->next = (ListNode*)malloc(sizeof(ListNode)); l1->next->val = 3; l1->next->next = (ListNode*)malloc(sizeof(ListNode)); l1->next->next->val = 5; l1->next->next->next = NULL; ListNode* l2 = (ListNode*)malloc(sizeof(ListNode)); l2->val = 2; l2->next = (ListNode*)malloc(sizeof(ListNode)); l2->next->val = 4; l2->next->next = (ListNode*)malloc(sizeof(ListNode)); l2->next->next->val = 6; l2->next->next->next = NULL; // 合并两个升序排列的链表一个降序排列的链表 ListNode* mergedList = mergeSortedList(l1, l2); // 打印结果 ListNode* curr = mergedList; while (curr != NULL) { printf("%d ", curr->val); curr = curr->next; } printf("\n"); return ; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值