如何判断链表相交
Posted 慢慢走
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何判断链表相交相关的知识,希望对你有一定的参考价值。
链表相交:对于链表而言,两个链表如果相交就会合并成一个后继,之后后继成为一个链表。根据相交的理论可以建立出两个简单的链表相交。
当用户在第一个链表中输入10的那个点作为要相交的那个点,第二个链表输入零之后就与第一个链表的10那个点相交。
代码如下:
1 #include <stdio.h> 2 typedef struct Linklist{ 3 int num; 4 struct Linklist *next; 5 }list; 6 7 struct Linklist *in; 8 9 void addLink(list *head){ 10 list *newNode; 11 int number=5; 12 while(1){ 13 printf("Please input:"); 14 scanf("%d",&number); 15 if(number==0){ 16 head->next=NULL; 17 return; 18 } 19 newNode=(struct Linklist *)malloc(sizeof(struct Linklist)); 20 newNode->num=number; 21 head->next=newNode; 22 head=newNode; 23 if(number==10){ 24 in=head; 25 } 26 } 27 head->next=NULL; 28 } 29 30 void addLink2(list *head){ 31 list *newNode,*p; 32 // p=head; 33 int number=5; 34 while(number!=0){ 35 printf("Please input:"); 36 scanf("%d",&number); 37 if(number==0){ 38 newNode->next=in; 39 return; 40 } 41 newNode=(struct Linklist *)malloc(sizeof(struct Linklist)); 42 newNode->num=number; 43 head->next=newNode; 44 head=newNode; 45 } 46 47 } 48 49 void printLink(list *head){ 50 list *p; 51 p=head->next; 52 while(1){ 53 printf("%d ,",p->num); 54 head=p; 55 p=p->next; 56 if(p==NULL) return; 57 } 58 } 59 60 61 62 63 int main(void){ 64 struct Linklist *head=(struct Linklist *)malloc(sizeof(struct Linklist)); 65 struct Linklist *head2=(struct Linklist *)malloc(sizeof(struct Linklist)); 66 67 addLink(head); 68 printLink(head); 69 printf("\n"); 70 71 addLink2(head2); 72 printLink(head2); 73 printf("\n"); 74 75 return 0; 76 }
这样就建立好了一个相交的链表,输入输出一下:
这就实现了链表的相交。
之后就是解决链表相交的问题,那么如何判断链表的相交呢?
看看两个链表相交到底是怎么回事吧,有这样的的几个事实:(假设链表中不存在环)
(1)一旦两个链表相交,那么两个链表中的节点一定有相同地址。
(2)一旦两个链表相交,那么两个链表从相交节点开始到尾节点一定都是相同的节点。
我想到的方法类似于选择排序,从第二个链表中选择一个元素和每个第一个链表中的每个元素的后继指向的地址作比较,出现地址相同的元素,就说明链表有相交。
即 a->next==b->next
第二种方法就是看每个链表的最后一个元素,假如两个链表最后一个元素的地址是相同的,那么链表必然相交的。
那么如果数据量很大,是商议的数据量,这样遍历起来就感觉很慢了,两个链表编译一次就是平方介,这个时候应该怎么判断呢?
那么还有一种解法就是:可以把第二个链表接在第一个链表后面,如果得到的链表有环,则说明这两个链表相交,否则,这两个链表不相交,这样把问题转化为判断一个链表是否有环,这样利用检测环的方式可能能快一点。
以上是关于如何判断链表相交的主要内容,如果未能解决你的问题,请参考以下文章