zoukankan      html  css  js  c++  java
  • 如何判断链表相交

    链表相交:对于链表而言,两个链表如果相交就会合并成一个后继,之后后继成为一个链表。根据相交的理论可以建立出两个简单的链表相交。

    当用户在第一个链表中输入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("
    ");
    70     
    71     addLink2(head2);
    72     printLink(head2);
    73     printf("
    ");
    74     
    75     return 0;    
    76 }

    这样就建立好了一个相交的链表,输入输出一下:

    这就实现了链表的相交。

    之后就是解决链表相交的问题,那么如何判断链表的相交呢?

    看看两个链表相交到底是怎么回事吧,有这样的的几个事实:(假设链表中不存在环)

      (1)一旦两个链表相交,那么两个链表中的节点一定有相同地址。

      (2)一旦两个链表相交,那么两个链表从相交节点开始到尾节点一定都是相同的节点。

    我想到的方法类似于选择排序,从第二个链表中选择一个元素和每个第一个链表中的每个元素的后继指向的地址作比较,出现地址相同的元素,就说明链表有相交。

    即 a->next==b->next

    第二种方法就是看每个链表的最后一个元素,假如两个链表最后一个元素的地址是相同的,那么链表必然相交的。

    那么如果数据量很大,是商议的数据量,这样遍历起来就感觉很慢了,两个链表编译一次就是平方介,这个时候应该怎么判断呢?

    那么还有一种解法就是:可以把第二个链表接在第一个链表后面,如果得到的链表有环,则说明这两个链表相交,否则,这两个链表不相交,这样把问题转化为判断一个链表是否有环,这样利用检测环的方式可能能快一点。

  • 相关阅读:
    线程的简单介绍
    队列Joinablequeue的使用,以及生产者消费者模型的认识
    使用子线程来完成链接循环和通信循环
    使用socketserver实现简单的下载和上传
    类的绑定方法学习
    类的组合-多态-封装等特性的简单学习
    爬虫之亚马逊爬取
    JavaScript 面试中常见算法问题详解
    JavaScript 的 this 指向问题深度解析
    深入理解 JavaScript 中的函数
  • 原文地址:https://www.cnblogs.com/Summer7C/p/5270876.html
Copyright © 2011-2022 走看看