判断两个单链表是否相交及相交的第一个节点
/* 问题: 1.判断两个单链表是否相交 2.找出第一个相交节点 解题思路: 1.若连个链表相交则从相交节点开始以后节点都是一样的 2.通过链表长度判断然后去寻找 */ #include<stdlib.h> #include<stdio.h> /* 创建节点 */ typedef struct STU { char a; struct STU *next; }*SListNode; SListNode ListA; SListNode ListB; /* 创建链表A */ SListNode createAlist(char a) { SListNode headA=(SListNode)malloc(sizeof(struct STU)); headA->a=a; headA->next=NULL; return headA; } /* 创建链表B */ SListNode createBlist(char b) { SListNode headB=(SListNode)malloc(sizeof(struct STU)); headB->a=b; headB->next=NULL; return headB; } /* 插入元素 */ SListNode insertElement(SListNode h,char a) { SListNode p=h; SListNode n=(SListNode)malloc(sizeof(struct STU)); if(n==NULL) { printf("ERROR:内存申请失败\n"); return NULL; } n->a=a; n->next=NULL; while(p->next!=NULL) { p=p->next; } p->next=n; return n; } /* 打印链表 */ void printfList(SListNode h) { int i=0; SListNode p=h; while(p!=NULL) { i++; printf("No.%d Element:%c\n",i,p->a); p=p->next; } } /* 判断两链表是否相交 并给出第一个相交节点元素 */ void IsIntersectant(SListNode A,SListNode B) { char res; int n=0; SListNode pa=A; SListNode pb=B; int Alength=0; int Blength=0; while(pa->next!=NULL) { Alength++; pa=pa->next; } while(pb->next!=NULL) { Blength++; pb=pb->next; } if((pa->a==pb->a)&&(pa==pb)) { printf("A链表和B链表相交\n"); pa=ListA; pb=ListB; if(Alength==Blength) { while(Alength--) { if(pa==pb) { res=pa->a; break; } pa=pa->next; pb=pb->next; } } else if(Alength>Blength) { n=Alength-Blength; while((n)--) { pa=pa->next; } while(Blength--) { if(pa==pb) { res=pa->a; break; } pa=pa->next; pb=pb->next; } } else { n=Blength-Alength; while((n)--) { pb=pb->next; } while(Alength--) { if(pa==pb) { res=pa->a; break; } pa=pa->next; pb=pb->next; } } printf("相较于节点元素:%c",res); } } /* 创建相交的两条链表 相交节点Nnode 相交节点元素:@ */ void createIntersectantList(void) { SListNode Nnode=(SListNode)malloc(sizeof(struct STU)); Nnode->a='@'; Nnode->next=NULL; insertElement(Nnode,'c'); insertElement(Nnode,'f'); insertElement(Nnode,'r'); insertElement(Nnode,'e'); insertElement(Nnode,'e'); ListA=createAlist('A'); insertElement(ListA,'1'); insertElement(ListA,'4')->next=Nnode; ListB=createBlist('B'); insertElement(ListB,'5'); insertElement(ListB,'6'); insertElement(ListB,'7'); insertElement(ListB,'8')->next=Nnode; printfList(ListA); printfList(ListB); IsIntersectant(ListA,ListB); } int main(void) { createIntersectantList(); }
posted on 2017-01-24 17:09 HelloWorldTotti 阅读(694) 评论(0) 编辑 收藏 举报