链表的合并(先排序在合并)

其实该类型是简单的,其实更加应该去先对链表先进行排序后在进行的合并。

关于排序的核心就是进行Node中的数据进行大小的交换就可以了。其实上非常简单的,当然借助辅助指针,来进行数据指引。这里排序就有多种排序方法,比如冒泡、归并、堆、二叉、基数、选择、原地重排等等排序,按照自己要求和实际问题分析进行选择排序算法。

数据类型为:

typedef int Element;

#define NOT -9999

typedef struct  Node{

    Element data;

    struct Node *next;

}Node;

这里写了一个简单的冒泡排序时间复杂度-O(n^2)---

void sort(Node *h)

{

    Node *p,*q;

    for(p=h->next;p!=NULL;p=p->next)

    {

        for(q=p->next;q!=NULL;q=q->next)

        {

            if(q->data<p->data)

            {

                Element temp=p->data;

                p->data=q->data;

                q->data=temp;

            }

        }

    }

}

--这里还可以改进的地方,当小于时候我们应该做一个标记flag,大于就break;这样最优可以为O(nlogn)了,优化程序;

创建链表:

Node * CreateList()

{

    Node *head;

    Node *p=(Node*)malloc(sizeof(Node));

    head=p;

    printf("input list in order by asc:");

    while(p->data!=NOT)

    {

        Node *s=(Node*)malloc(sizeof(Node));

        scanf("%d",&s->data);

        p->next=s;

        p=s;

    }

    p->next=NULL;

    return head;

}

合并链表;

Node* NewList(Node *s1,Node *s2)

{

    Node *head=(Node*)malloc(sizeof(Node));

    Node *cur=NULL;

    Node *l1=s1->next;

    Node*l2=s2->next;

    if(l1->data>l2->data)

    {

        cur=l2;

        l2=l2->next;

        head->next=cur;

    }

    if(l1->data<=l2->data)

    {

        cur=l1;

        l1=l1->next;

        head->next=cur;

    }

    while(l1!=NULL&&l2!=NULL)

    {

        if(l1->data>l2->data)

        {

            cur->next=l2;

            cur=l2;

            l2=l2->next;

        }

        else

        {

            cur->next=l1;

            cur=l1;

            l1=l1->next;

        }

        

        if(l1==NULL)

        {

            cur->next=l2;

        }

        if(l2==NULL)

        {

            cur->next=l1;

        }

    }

    return head;

}

其实认真看的会发现有一个问题就是我只是考虑了对两个链表的添加而已,而并非考虑有重复元素。

自己于是有写了一个对于链表的去处重复项的方法;

void removeRepition(Node *h)

{

    Node *p,*q,*r;

    p=h->next;

    while(p!=NULL)

    {

        r=p;

        q=p->next;

        while(q!=NULL)

        {

            if(p->data==q->data)

            {

                r->next=q->next;

                free(q);

                q=r;

            }

            else

            {

                r=r->next;

            }

            q=q->next;

        }

        p=p->next;

    }

}

-----其实在这里还有其他方法。我去网上查过还有其他方法,这是自己比较笨的办法,复杂度平方级别的,我看了有借助hash算法也可以解决。

这里有用例测试:


希望大家指出学生的不足之处。与大家共同进步。






  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值