• 判断2个单链表是否相交,并求出第一个相交结点


    不考虑单链表有环的情况下

    如果2个单链表相交,一定是Y型链表

    1.遍历2个链表到尾结点,记录2个链表的长度x,y
    2.尾结点相同,则相交。
    3.从表头开始,长链表先走|x-y|步,之后2个链表一起走,判断第一个相同的点。
     
      1 #include <stdio.h>  
      2 #include <stdlib.h>  
      3 #include <string.h>  
      4 typedef struct student             //定义链表结构  
      5 {  
      6     int num;  
      7     struct student *pnext;  
      8 }stu,*pstu;  
      9 void link_tail_insert(pstu ,pstu ,int );                        //尾插法建立2个链表  
     10 void link_show(pstu );                                                       //展示链表  
     11 void link_judge_intersect(pstu ,pstu );                          //判断链表是否有交点  
     12 void link_bulid_intersect(pstu ,pstu ,pstu ,pstu *); //建立Y型链表  
     13 void main(){  
     14     pstu phead1,ptail1,phead2,ptail2;  
     15     int i;  
     16     phead1 = NULL;  
     17     ptail1 = NULL;  
     18     phead2 = NULL;  
     19     ptail2 = NULL;  
     20     while(scanf("%d",&i) != EOF){                                       
     21         link_tail_insert(&phead1,&ptail1,i);  
     22         link_tail_insert(&phead2,&ptail2,i);  
     23     }  
     24     link_show(phead1);  
     25     link_bulid_intersect(phead1,phead2,ptail1,&ptail2);  
     26     link_show(phead2);    
     27     link_judge_intersect(phead1,phead2);  
     28     system("pause");  
     29   
     30 }  
     31 void link_tail_insert(pstu *phead,pstu *ptail,int i){              //尾插法建立链表  
     32     pstu pnew;  
     33     pnew = (pstu)malloc(sizeof(stu));  
     34     memset(pnew,0,sizeof(stu));  
     35     pnew->num = i;  
     36     if(*ptail == NULL){  
     37         *phead = pnew;  
     38         *ptail = pnew;  
     39     }  
     40     else{  
     41         (*ptail)->pnext = pnew;  
     42         *ptail = pnew;  
     43     }  
     44 }  
     45 void link_show(pstu phead){                                         //输出链表  
     46     pstu pshow;  
     47     pshow = phead;  
     48     if(phead == NULL)  
     49     {  
     50         printf("no exsit\n");  
     51         return;  
     52     }  
     53     while(pshow != NULL){  
     54         printf("%d ",pshow->num);  
     55         pshow = pshow->pnext;  
     56     }  
     57     putchar('\n');  
     58 }  
     59 void link_bulid_intersect(pstu phead1,pstu phead2,pstu ptail1,pstu *ptail2){   //把第2个链表拼接到第一个链表第三个结点的位置。  
     60     pstu i;  
     61     i = phead1;  
     62     i = i->pnext->pnext;            
     63     (*ptail2)->pnext = i;  
     64     *ptail2 = ptail1;  
     65 }  
     66 void link_judge_intersect(pstu phead1,pstu phead2){             //判断链表是否有交点  
     67     int x,y;  
     68     pstu i,j,prei,prej;  
     69     x = y = 0;  
     70     i = prei = phead1;                                        //建立前置结点,和当前结点  
     71     j = prej = phead2;  
     72     while(i != NULL){                                        //2个链表运行到尾部  
     73         prei = i;  
     74         i = i->pnext;  
     75         x++;  
     76     }  
     77     while(j != NULL){  
     78         prej = j;  
     79         j = j->pnext;  
     80         y++;  
     81     }  
     82     if(prei != prej)                                      //尾结点不相同 没有相交  
     83         printf("Link has no intersect.\n");  
     84     else{  
     85         i = phead1;  
     86         j = phead2;  
     87         if(x > y){                                        //第1个链表长度长,先走X-Y步  
     88             x = x - y;  
     89             while(x > 0){  
     90                 i = i->pnext;  
     91                 x--;  
     92             }  
     93             while(i != NULL){                              //一起走,知道相遇或者达到NULL  
     94                 if(i == j){  
     95                     printf("Link has intersect.\n");  
     96                     printf("%d\n",i->num);  
     97                     break;  
     98                 }  
     99                 i = i->pnext;  
    100                 j = j->pnext;  
    101             }  
    102         }  
    103         else{  
    104             y = y - x;                           //第2个链表长度长,先走X-Y步  
    105             while(y > 0){  
    106                 j = j->pnext;  
    107                 y--;  
    108             }  
    109             while(i != NULL){                       //一起走,知道相遇或者达到NULL  
    110                 if(i == j){  
    111                     printf("Link has intersect.\n");  
    112                     printf("%d\n",i->num);  
    113                     break;  
    114                 }  
    115                 i = i->pnext;  
    116                 j = j->pnext;  
    117             }  
    118         }  
    119           
    120     }  
    121 }  
  • 相关阅读:
    hibernate之初学复合主键
    hibernate之初学增删改查
    hibernate之配置文件帮助文档
    hibernate之初学项目搭建
    Python调用OpenCV读显写
    C++写入txt
    C++逐词读取txt
    C++逐行读取txt
    C#调用C++系列二:传结构体
    C#调用C++系列一:简单传值
  • 原文地址:https://www.cnblogs.com/boluo007/p/5470228.html
Copyright © 2020-2023  润新知