给定2个链表,求这2个链表的并集(链表)和交集(链表)。不要求并集(链表)和交集(链表)中的元素有序。

如,输入:

List1: 10->15->4->20

List2: 8->4->2->10

输出:

交集(链表):4->10

并集(链表):2->8->20->4->15->10

方法一(简单、直观的方法):

下面是得到2个链表的并集和交集的简单算法。

InterSection(list1,list2): 初始化结果链表为空,遍历链表1,在链表2中查找它的每一元素,如果链表2中也有这个元素,则将该元素插入到结果链表中。

Union(list1,list2): 初始化结果链表为空,将链表1中的所有元素都插入到结果链表中。遍历链表2,如果结果链表中没有该元素,则插入,否则跳过该元素。

#include

#include

/*Link list node*/

struct node

{

int data;

struct node* next;

};

/* A utility function to insert a node at the begining of a linked list */

void push(struct node **head_ref, int new_data);

/* A utility function to chec if given data is present in a list */

bool isPresent(struct node *head, int data);

/* Function to get union of two linked lists head1 and head2*/

struct node *getUnion(struct node *head1, struct node *head2)

{

struct node *result = NULL;

struct node *t1 = head1, *t2 = head2;

//Insert all elements of list1 to result list

while(t1 != NULL)

{

push(&result, t1->data);

t1 = t1->next;

}

//Insert those elements of list2 which are not present in result list

while(t2 != NULL)

{

if(!isPresent(result, t2->data))

push(&result, t2->data);

t2 = t2->next;

}

return result;

}

/* Function to get intersection of two linked lists head1 and head2 */

struct node *getIntersection(struct node *head1, struct node *head2)

{

struct node *result = NULL;

struct node *t1 = head1;

//Traverse list1 and search each element of it in list2. If the element

//is present in list2, then insert the element to result

while( t1 != NULL )

{

if(isPresent(head2, t1->data))

push(&result, t1->data);

t1 = t1->next;

}

return result;

}

/* A utility function to insert a node at the begining of a linked list */

void push(struct node**head_ref, int new_data)

{

/*allocate node*/

struct node* new_node = (struct node*)malloc(sizeof(struct node));

/* put in the data */

new_node->data = new_data;

/*link the old list off the new node*/

new_node->next = (*head_ref);

/* move the head to point to the new node*/

(*head_ref) = new_node;

}

/*A utility function fto print a linked list*/

void printList(struct node *node)

{

while( node != NULL )

{

printf("%d ", node->data);

node = node->next;

}

}

/*A utility function that returns true  if data is present in

linked list else reurn false */

bool isPresent(struct node *head, int data)

{

struct node *t = head;

while(t != NULL)

{

if( t->data == data )

return 1;

t = t->next;

}

return 0;

}

/* Drier program to test above function*/

int main()

{

/* Start with the empty list */

struct node* head1 = NULL;

struct node* head2 = NULL;

struct node* intersecn = NULL;

struct node* unin = NULL;

/*create a linked lits 10->15->5->20 */

push (&head1, 20);

push (&head1, 4);

push (&head1, 15);

push (&head1, 10);

/*create a linked lits 8->4->2->10 */

push (&head2, 10);

push (&head2, 2);

push (&head2, 4);

push (&head2, 8);

intersecn = getIntersection (head1, head2);

unin = getUnion (head1, head2);

printf ("\n First list is \n");

printList (head1);

printf ("\n Second list is \n");

printList (head2);

printf ("\n Intersection list is \n");

printList (intersecn);

printf ("\n Union list is \n");

printList (unin);

printf("\n");

return 0;

}

时间复杂度:在这个程序中,链表的并和交操作的时间复杂度都是O(mn),m是链表1的元素个数,n是链表2的元素个素。

方法2(使用归并排序):

使用这个方法,求2个链表的并集和交集的操作非常相似。首先,将对2个链表进行排序,然后遍历2个链表,得到2个了表的交集和并集。

下面是具体实现步骤:

用归并排序对第1个链表进行排序,这个操作的时间复杂度为O(mLogm).[点击这里查看详细]

用归并排序堆第2个链表进行排序,这个操作的时间复杂度为O(nLogn).

线性遍历2个有序的链表,得到2个链表的交集和并集。这个操作的时间复杂度为O(m+n).[这步类似于求有序数组的交集和并集,后者之前已经实现过,点击这里查看详细]

这个方法的时间复杂度是O(mLogm+ nLogn),优于第一种方法。

方法3(hash法):

Union(list1, list2)

首先初始化结果链表为NULL,创建一个空的hash表,遍历两个链表,将链表中的元素插入到hash表,插入元素的时候同时检查hash表中时候是否已经存在该元素,如果hash表中不存在该元素,则同时将该元素插入到结果链表中,如果hash表中已经存在,则忽略该元素,继续遍历下一个元素。

InterSection(list1, list2)

首先初始化结果链表为NULL,创建一个空的hash表,遍历list1,将list1中的每一个元素都插入到hash表中。然后遍历list2,对于list2中的元素,如果已经存在于hash表中,则将该元素插入到结果链表,如果不存在与hash表中,则忽略该元素,继续遍历下一个元素。

具体实现可以用hashMap,将链表中的元素当做key,value为此元素出现的次数。

具体代码可参考下面代码修改后实现

packagecom.xtfggef.hashmap;importjava.util.HashMap;importjava.util.Map;importjava.util.Set;/*** 打印在数组中出现n/2以上的元素

* 利用一个HashMap来存放数组元素及出现的次数

*@authorerqing

**/

public classHashMapTest {public static voidmain(String[] args) {int [] a = {2,3,2,2,1,4,2,2,2,7,9,6,2,2,3,1,0};

Map map = new HashMap();for(int i=0; i

tmp+=1;

map.put(a[i], tmp);

}else{

map.put(a[i],1);

}

}

Set set = map.keySet();//------------1------------

for(Integer s : set) {if(map.get(s)>=a.length/2){

System.out.println(s);

}

}//--------------2---------------

}

}

这个方法的效率取决与hash表的实现技术,一般情况下,这个方法都比上面两种要好。

java链表并集_求链表的并集和交集相关推荐

  1. java实现链表冒泡排序_单链表的冒泡排序

    起因 今天利用空余时间在九度做ACM的时候,需要对单链表进行排序,由于单链表不是随机存取结构,所以我不建议用快速排序,因此采用了冒泡排序! 带头节点的尾插法构建单链表 //初始化带头节点的链表 str ...

  2. python单链表操作_单链表的创建、增删改查等操作(Python实现)

    单链表的创建.增删改查等操作(Python实现) # 单链表 class Node: def __init__(self, elem): self.elem = elem self.next = No ...

  3. 链表题目--2 求链表的中间结点 和 求链表中倒数第k个结点

    求链表的中间结点 思路 一个走两步,一个走一步.一个走到尾,另外一个就走到了中间 /*** Definition for singly-linked list.* struct ListNode {* ...

  4. 用java编写圆锥_求java大神帮忙 求大神帮助!Java

    导航:网站首页 > 求java大神帮忙 求大神帮助!Java 求java大神帮忙 求大神帮助!Java 相关问题: 匿名网友: 普通类 public class CircularA { //求圆 ...

  5. python单链表排序_单链表排序之选择排序

    单链表排序是单链表的常见编程任务之一,也是面试中经常出现的题目.单链表排序的关键是交换算法,需要额外考虑.选择排序是比较直观的排序算法之一,这里就使用选择排序实现单链表的排序. C实现代码如下: Li ...

  6. GO和JAVA如何处理两个数组中的并集和交集

    最近,在项目中碰到这样一个问题,我们在查看某个模块内容的是否,需要获取该角色下所有用户权限的集合,而某个角色下的用户权限不一样,那么我们需要去得到所有用户拥有的权限的一个并集,根据这个整理了关于go和 ...

  7. java 链表 深拷贝_单链表深拷贝的实现

    相比于顺序表的深拷贝,单链表的原理就简单多了.只需要构造一个空的单链表.一个空的结点数组,然后将被拷贝的单链表的数据域依次赋值到结点数组的数据域上,最后再将结点数组依次连接到单链表上即可. 代码实例: ...

  8. java 外部类似_[求指点] 如何用java 实现类似linux中管道调用外部程序的功能

    想写个小程序实现类似linux中管道的功能,创建一个外部子进程,然后主进程不断地写输入给子进程,而后把子进程的返回值取出. 如下的小代码就是从stdin读入一个字符串,调用子进程(cat)返回这个串, ...

  9. python链表翻转_反转链表(两种Python解法)

    题目: 反转一个单链表. 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 进阶: 你 ...

最新文章

  1. DHCP在企业网中的应用
  2. php date的警告
  3. 【分享】(性能优化)思考数据列表中“特殊的列”
  4. java 监听map的数据_使用监听器:定时清除map缓存的key value .
  5. 【科普】一图区分 IAAS + PAAS + SAAS
  6. SharePoint 编程指南(转)
  7. 别怕,是我......程序猿
  8. 到底该不该上马Vista 中小企业升级全攻略(上)
  9. ajax与DOM的使用,AJAX和DOM的运行经验
  10. Warning: lio_listio returned EAGAIN Performance degradation may be seen
  11. java单链表基本操作 一,Java_实现单链表-基本操作
  12. RabbitMQ学习笔记(3)----RabbitMQ Worker的使用
  13. 几何画板画椭圆_几何画板降龙十九式视频教程每天只要十分钟
  14. 框架整合——Spring与MyBatis框架整合
  15. 基于杂化材料银-氨基硅烷氧化石墨烯的化学战剂的电化学传感
  16. AngularJs参数传递
  17. Java汉字转拼音(简繁体转换)库之JPinYin
  18. 帆软公式如何用数据库字段_高考数学必背100招:如何用构造法求数列通项公式?...
  19. 大型网站的演化之路——读《大型网站技术架构》
  20. 【JS基础】JavaScript中的void 0

热门文章

  1. 人口、共享单车与地铁数据下载网站整理
  2. 高德、百度瓦片地图免费下载
  3. Java_Hive自定义函数_UDF函数清洗数据_清洗出全国的省份数据
  4. 冯洛伊曼计算机工作原理的设计思想是,冯?诺依曼计算机工作原理的设计思想是( )。...
  5. 李宏毅2022机器学习HW1收获
  6. CDO如何盘点算法、推动算法业务增长
  7. [转载]感受欧洲电影
  8. WIN/MAC使用exFat格式共用移动硬盘
  9. prayaya v3虚拟系统续期方法
  10. 机器人送丝软管型号和代码_国产焊接机器人的送丝系统可以三种不同的方式送丝...