14

问题

       已知递增有序的单链表A、B和C分别存储了一个集合。设计算法实现,并使求解结构A仍保持递增。要求算法的时间复杂度为O(|A| + |B| + |C|)。其中|A|为集合A的元素个数。

分析

       找B与C的交集,然后并到A中即可。
       可以分析下时间复杂度。

代码

void mergeList(LinkList A, LinkList B, LinkList C){
    LNode *p = A, *pa = A -> next, *pb = B -> next, *pc = C -> next;
    while(pb && pc) {
        if(pb -> data < pc -> data) {
            pb = pb -> next;
        }else if(pb -> data > pc -> data) {
            pc = pc -> next;
        }else if(pb -> data == pc -> data) {
            LNode *temp = (LinkList)malloc(sizeof(LNode));
            temp -> data = pb -> data;
            temp -> next = NULL;
            if(pa -> next == NULL) {
                pa -> next = temp;
                pa = pa -> next;
            }else {
                while(pa) {
                    if(pa -> data > temp -> data) {
                        temp -> next = pa;
                        p -> next = temp;
                        p = p -> next;
                        break;
                    }else if(pa -> data < temp -> data) {
                        pa = pa -> next;
                        p = p -> next;
                    }else if(pa -> data == temp -> data) {
                        pa = pa -> next;
                        p = p -> next;
                        break;
                    }
                }
                if(pa == NULL) {
                    p -> next = temp;
                    pa = temp;
                }
            }
            pb = pb -> next;
            pc = pc -> next;
        }
    }
}

源代码

http://123.206.59.223:8080/code/code/14.rar

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值