【单链表】两递增链表合并

void MergList(LNode *La, LNode *Lb, LNode *Lc){

    LNode *pa, *pb, *pc;

    pa = La->next;

    pb = Lb->next;

    pc = Lc = La;

    while(pa && pb){

        if(pa->data <= pb->data){ // 小的先挂到Lc上去

            pc->next = pa;

            pc = pc->next;

            pa = pa->next;

        }  

        else{

            pc->next = pb;

            pc = pc->next;

            pb = pb->next;

        }

    }  

    pc->next = pa? pa:pb; // 将剩余的所有节点直接挂到Lc上去

    free(Lb);

}

 

转自 http://www.cnitblog.com/chlclan/archive/2008/10/31/12584.html

使用C语言将两个递增单链表合并一个新的递增链表,主要思路是同时遍历两个链表,比较当前节点的值,将较小值的节点添加到新链表中,然后移动相应链表的指针。以下是示例代码: ```c #include <stdio.h> #include <stdlib.h> // 定义链表节点结构体 typedef struct Lnode { int data; struct Lnode *next; } Lnode; // 创建链表 void Lnodecreat(Lnode **L) { *L = (Lnode *)malloc(sizeof(Lnode)); (*L)->next = NULL; } // 插入节点 void Lnodeinsert(Lnode **L, int pos, int value) { Lnode *p = *L; for (int i = 0; i < pos; i++) { p = p->next; } Lnode *newNode = (Lnode *)malloc(sizeof(Lnode)); newNode->data = value; newNode->next = p->next; p->next = newNode; } // 打印链表 void printLnode(Lnode *L) { Lnode *p = L->next; while (p) { printf("%d ", p->data); p = p->next; } printf("\n"); } // 合并两个递增链表 void mergeLnode(Lnode *L, Lnode *X, Lnode *C) { Lnode *p = L->next; Lnode *q = X->next; Lnode *r = C; while (p && q) { if (p->data < q->data) { r->next = p; p = p->next; } else { r->next = q; q = q->next; } r = r->next; } // 处理剩余节点 if (p) { r->next = p; } if (q) { r->next = q; } } // 销毁链表 void Lnodedistory(Lnode *L) { Lnode *p = L; while (p) { Lnode *temp = p; p = p->next; free(temp); } } int main() { Lnode *L, *X, *C; Lnodecreat(&L); Lnodecreat(&X); Lnodecreat(&C); for (int i = 0; i < 10; ++i) { Lnodeinsert(&L, i, i * 10); } for (int i = 0; i < 10; ++i) { Lnodeinsert(&X, i, i * 9); } printf("L链表:"); printLnode(L); printf("X链表: "); printLnode(X); mergeLnode(L, X, C); printf("合并后的链表C:"); printLnode(C); Lnodedistory(C); return 0; } ``` ### 代码解释: 1. **结构体定义**:定义了`Lnode`结构体,包含数据域`data`和指向下一个节点的指针`next`。 2. **创建链表**:`Lnodecreat`函数用于创建一个链表。 3. **插入节点**:`Lnodeinsert`函数用于在指定位置插入新节点。 4. **打印链表**:`printLnode`函数用于遍历链表并打印节点的值。 5. **合并链表**:`mergeLnode`函数比较两个链表当前节点的值,将较小值的节点添加到新链表中,直到其中一个链表遍历完,然后将另一个链表的剩余部分直接连接到新链表末尾。 6. **销毁链表**:`Lnodedistory`函数用于释放链表占用的内存。 ### 复杂度分析: - **时间复杂度**:$O(m + n)$,其中$m$和$n$分别是两个链表的长度。 - **空间复杂度**:$O(1)$,只需要常数级的额外空间。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值