【数据结构】归并 非降序链表

【数据结构】归并 非降序链表

思想

将链表A和B归并为C,且保持元素相对位置不变。

  • 先定义三个指针pa,pb分别指向三个链表的头节点的下一个,pc指向新链表的第一个
  • 判断pa的数值和pc的数值,小的那一个放在pc的下一个

时间复杂度(O(LA.length+LB.length))

空间复杂度比顺序表小

只需把之前两个链表的比较大小时候的节点链接成一个链表即可

代码

/*===============
 * 归并非降序链表
 *
 * 包含算法: 2.12
 ================*/

#include "MergeList.h"                    //**▲02 线性表**//

/*
 * ████████ 算法2.12 ████████
 *
 * 非递减链表归并:C=A+B
 *
 * 将链表A和B归并为C,且保持元素相对位置不变。
 * Lc利用La的头结点,Lb中结点均插入新链表Lc中。
 */
void MergeList(LinkList* La, LinkList* Lb, LinkList* Lc) {
    LinkList pa, pb, pc;
    
    pa = (*La)->next;
    pb = (*Lb)->next;
    pc = *Lc = *La;                        // 用La的头结点作为Lc的头结点
    
    // 遍历La和Lb
    while(pa && pb) {
        if(pa->data <= pb->data) {
            pc->next = pa;
            pc = pa;
            pa = pa->next;
        } else {
            pc->next = pb;
            pc = pb;
            pb = pb->next;
        }
    }
    
    // 插入剩余段
    pc->next = pa ? pa : pb;
    
    // 释放Lb的头结点所占内存
    free(*Lb);
    
    *La = NULL;
    *Lb = NULL;
}

posted @ 2019-12-15 15:00  嗨Sirius  阅读(95)  评论(0编辑  收藏  举报