题意:寻找两个链表的首个公共结点,输出其地址。
思路:
方法1. 如果LinkList1比LinkList2长,则让LinkList1先偏移(len1-len2)个结点,然后,让两个链表的的工作指针同时开始偏移,一旦遇到结点地址相同且数据域相同则退出。
方法2(更简洁). 首先遍历LinkList1,每访问一个结点,标记该结点为已经访问;然后,遍历LinkList2,一旦遇到当前结点已经被访问过了,就退出。
代码:
(方法1)
#include <cstdio> ; struct Node{ char data; int next; }LinkList[N]; int myStrlen(int head) { ; ){ len++; head=LinkList[head].next; } return len; } int main() { //freopen("pat.txt","r",stdin); int head1,head2,n; scanf("%d%d%d",&head1,&head2,&n); int curr,next; char data; ;i<n;i++){ scanf("%d %c %d",&curr,&data,&next); LinkList[curr].data=data; LinkList[curr].next=next; } int len1=myStrlen(head1); int len2=myStrlen(head2); int p1=head1,p2=head2; if(len1>len2){ int cnt=len1-len2; while(cnt--){ p1=LinkList[p1].next; } }else if(len1<len2){ int cnt=len2-len1; while(cnt--){ p2=LinkList[p2].next; } } && p2!=- ){ if(LinkList[p1].data==LinkList[p2].data && p1==p2) break; p1=LinkList[p1].next; p2=LinkList[p2].next; } ) printf("%d",p1); else printf("%05d",p1); ; }
(方法2)
#include <cstdio> ; struct Node{ char data; int next; bool vis; }LinkList[N]; int main() { //freopen("pat.txt","r",stdin); int head1,head2,n; scanf("%d%d%d",&head1,&head2,&n); int curr,next; char data; ;i<n;i++){ scanf("%d %c %d",&curr,&data,&next); LinkList[curr].data=data; LinkList[curr].next=next; LinkList[curr].vis=false; } int p=head1; ){ LinkList[p].vis=true; p=LinkList[p].next; } p=head2; bool flag=false; ){ if(LinkList[p].vis){ flag=true; break; } p=LinkList[p].next; } if(flag) printf("%05d",p); else printf("-1"); ; }