c语言将两个有序表合并为一个有序表,c语言实现两个有序链表的合并(代码示例)...

本篇文章通过代码示例介绍一下使用c语言合并两个有序链表的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。

7182196577ee68dde56dea15244dab06.png

教程推荐:《c语言教程视频》

c语言实现两个有序链表的合并

现有两个有序单链表,通过代码实现将两个单链表合并为一个有序的新表,要求使用旧表的空间,不能新分配内存#include #include typedef struct List{

int a;

struct List *next;}list;void newList(list *l){

//初始化头节点

l->next = NULL;}void setList(list * l){

//建立链表

int i = 1;

int j;

while (i)

{

scanf_s("%d", &j);

if (j == -1)

{

i = 0;

}

else

{

list *l1 = (list *)malloc(sizeof(list));//为新的结点分派内存

l1->a = j;//储存数据

/*

将最后结点的next区域指向新结点

将新结点的next区域指向设置为空

*/

l->next = l1;

l1->next = NULL;

l = l->next;

}

}}void printfList(list *l){

printf("该链表内容为:\n");

while (l->next)

{

printf("%d\t", l->next->a);

l = l->next;

}

printf("\n");}list *add(list *LA, list *LB){

//记录两个链表的头结点

list *la=LA;

list *l = LA;

list *lb = LB;

//移动指针

LA = LA->next;

LB = LB->next;

la->next = NULL;

while (LA!=NULL&&LB!=NULL)

{

/*

将两个结点的数据进行比较,数据较小的结点接在头结点后面,

*/

if (LA->a < LB->a)

{

la->next = LA;

la = LA;

LA = LA->next;

}

else

{

la->next = LB;

la = LB;

LB = LB->next;

}

}

//若其中一个链表的结点已经全接在新表中则将另一个链表的剩余结点接在新表的后面

if (LA)

{

la->next = LA;

}

if(LB)

{

la->next = LB;

}

free(lb);

return l;}int main(){

//为结点分配内存

list *LA = (list *)malloc(sizeof(list));

list *LB = (list *)malloc(sizeof(list));

//初始化结点

newList(LA);

newList(LB);

//建立链表

setList(LA);

setList(LB);

//输出链表的内容

printf("LA的数据:\n");

printfList(LA);

printf("LB的数据:\n");

printfList(LB);

list *LC = add(LA, LB);

//输出合并后的新表

printfList(LC);

system("pause");

return 0;}

6475c2a7d2f3b355b02e2c9a64b57b12.png

更多编程相关知识,请访问:编程入门!!

以下是将两个链表合并一个递增的有序链表代码示例C语言): ```c #include <stdio.h> #include <stdlib.h> // 定义链表结构体 struct ListNode { int val; struct ListNode *next; }; // 合并两个有序链表 struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) { // 如果其中一个链表为空,则直接返回另一个链表 if (l1 == NULL) { return l2; } if (l2 == NULL) { return l1; } // 定义一个链表头节点 struct ListNode *head = (struct ListNode *)malloc(sizeof(struct ListNode)); head->val = 0; head->next = NULL; // 定义一个指针节点,用于遍历合并后的链表 struct ListNode *p = head; // 当两个链表都不为空时,比较它们的头节点大小 while (l1 != NULL && l2 != NULL) { if (l1->val < l2->val) { p->next = l1; l1 = l1->next; } else { p->next = l2; l2 = l2->next; } p = p->next; } // 将剩余未遍历完的链表直接接到合并后的链表尾部 p->next = l1 == NULL ? l2 : l1; return head->next; } int main() { // 创建两个有序链表 struct ListNode *l1 = (struct ListNode *)malloc(sizeof(struct ListNode)); l1->val = 1; struct ListNode *l1_1 = (struct ListNode *)malloc(sizeof(struct ListNode)); l1_1->val = 2; l1_1->next = NULL; l1->next = l1_1; struct ListNode *l2 = (struct ListNode *)malloc(sizeof(struct ListNode)); l2->val = 1; struct ListNode *l2_1 = (struct ListNode *)malloc(sizeof(struct ListNode)); l2_1->val = 3; l2_1->next = NULL; l2->next = l2_1; // 合并两个有序链表 struct ListNode *mergedList = mergeTwoLists(l1, l2); // 输出合并后的链表 while (mergedList != NULL) { printf("%d ", mergedList->val); mergedList = mergedList->next; } printf("\n"); return 0; } ``` 当您问我我在前面对您说了什么时,这里是一个笑话: 为什么小明的作业总是比我多?因为他比你强。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值