链表的合并(先排序在合并)
来源:互联网 发布:阿里云服务器华东2 编辑:程序博客网 时间:2024/05/16 06:05
其实该类型是简单的,其实更加应该去先对链表先进行排序后在进行的合并。
关于排序的核心就是进行Node中的数据进行大小的交换就可以了。其实上非常简单的,当然借助辅助指针,来进行数据指引。这里排序就有多种排序方法,比如冒泡、归并、堆、二叉、基数、选择、原地重排等等排序,按照自己要求和实际问题分析进行选择排序算法。
数据类型为:
typedef int Element;
#define NOT -9999
typedef struct Node{
Element data;
structNode *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算法也可以解决。
这里有用例测试:
- 链表的合并(先排序在合并)
- 合并排序链表
- 合并排序链表
- 两个已排序链表的合并
- 两个已排序链表的合并
- 链表的合并与排序
- 合并两个排序的链表
- 合并两个排序的链表
- 合并两个排序的链表
- 合并两个排序的链表
- 合并两个排序的链表
- 合并两个排序的链表
- 合并两个排序的链表
- 合并两个排序的链表
- 链表的删除 合并 排序 反转
- 合并两个排序的链表
- 合并两个排序了的链表
- 合并两个排序的链表
- JavaScript之兼容性事件的绑定和解除
- 前端技术浏览器对象模型篇
- 如何获取input框type=file选中的文件对象(FileReader)
- 线程同步
- POJ 2387 经典解法,优先队列的dijkstra+链式前向星存储
- 链表的合并(先排序在合并)
- [paper] Simple Does It
- 略谈OpenGL中的共享上下文(EGL Context)
- 关于R语言创建pdf文本和txt文本的一些问题
- 综合除法和余数定理
- android studio gradle 命令行
- SpringBoot开发详解(十二) -- SpringBoot中执行定时任务
- 杭电oj1049 根据规律 写几个就推出来了
- 杭电oj1040 简单的排序