微软面试题<七>
2013-04-19 00:53
573 查看
题目:
微软亚院之编程判断俩个链表是否相交:
给出俩个单向链表的头指针,比如h1,h2,判断这俩个链表是否相交。
为了简化问题,我们假设俩个链表均不带环。
问题扩展:
1.如果链表可能有环列?
2.如果需要求出俩个链表相交的第一个节点列?
先来解决两链表均不带环的情况:
需要注意的是链表相交不是指链表含有相同的元素,而是地址相同.通过此图可以发现
相交的两个链表其最后一个元素的地址必相同,所以可以遍历两链表至尾结点,然后比较得出结果.
代码实现:
微软亚院之编程判断俩个链表是否相交:
给出俩个单向链表的头指针,比如h1,h2,判断这俩个链表是否相交。
为了简化问题,我们假设俩个链表均不带环。
问题扩展:
1.如果链表可能有环列?
2.如果需要求出俩个链表相交的第一个节点列?
先来解决两链表均不带环的情况:
需要注意的是链表相交不是指链表含有相同的元素,而是地址相同.通过此图可以发现
相交的两个链表其最后一个元素的地址必相同,所以可以遍历两链表至尾结点,然后比较得出结果.
代码实现:
//判断两链表(均不带环)是否相交 #include<iostream> #include<cmath> using namespace std; struct ListNode { int data; ListNode *next; }; void CreateList(ListNode *&root) { cout<<"建立链表,输入零代表结束!"<<endl; int value; ListNode *last=new ListNode; last=NULL; while(1) { cin>>value; if(value==0) break; ListNode *newnode=new ListNode; newnode->data=value; newnode->next=NULL; if(root==NULL) { root=newnode; last=newnode;} else { last->next=newnode; last=newnode; } } } void Travel(ListNode *root) { while(root!=NULL) { cout<<root->data<<" address="<<root<<endl; root=root->next; } } bool Find(ListNode *root1,ListNode *root2) { //判断相交,直接看最后一个元素的地址是否相同 int len1=1,len2=1,k; ListNode *pHead1=new ListNode; ListNode *pHead2=new ListNode; pHead1=pHead2=NULL; pHead1=root1; pHead2=root2; while(pHead1->next) { len1++; pHead1=pHead1->next; } while(pHead2->next) { len2++; pHead2=pHead2->next; } if(pHead1!=pHead2) return false; else { cout<<"两链表相交!"<<endl; //下面寻找第一个相交的点 k=abs(len1-len2); pHead1=root1; pHead2=root2; if(len1<len2) //如果第一个链表长一些 { while(k--) pHead2=pHead2->next; while(pHead1!=pHead2) { pHead1=pHead1->next; pHead2=pHead2->next; } cout<<"第一个相交的点是"<<pHead1->data<<" address="<<pHead1<<endl; } else if(len1>=len2) { while(k--) pHead1=pHead1->next; while(pHead1!=pHead2) { pHead1=pHead1->next; pHead2=pHead2->next; } cout<<"第一个相交的点是"<<pHead1->data<<" address="<<pHead1<<endl; } return true; } } int main() { ListNode *root1=new ListNode; ListNode *root2=new ListNode; ListNode *p=new ListNode; ListNode *q=new ListNode; int i=4; p=q=root1=root2=NULL; CreateList(root1); cout<<"The First List as follows"<<endl; Travel(root1); CreateList(root2); //构造第二个链表,先遍历到尾节点 p=root2; q=root1; while(p->next) p=p->next; while(i--) q=q->next; p->next=q; cout<<"The Secone list"<<endl; Travel(root2); cout<<"The Result"<<endl; Find(root1,root2); system("pause"); return 0; }
相关文章推荐
- 微软面试题<三>
- 微软面试题<二>
- 微软面试题<五>
- 微软面试题<一>
- 微软面试题<四>
- 微软面试题<十>
- 程序员 7K面试题<二>---银行业务系统
- Java 面试题之反射的应用(如何在List<String> list = new ArrayList<String>();中放入Integer类型的数据)
- 微软报表rdlc有类似dephi的FastReport的<运行时报表 最终用户 调节位置>功能吗?
- 黑马程序员 java基础<七>--网络编程(1)
- UML参考手册 第三部分 参 考 资 料 第13章 术 语 大 全 <七>
- iOS 面试题:OC基本概念题<续>
- Android实战简易教程<七>(Activity的启动模式)
- Android UI设计之<七>自定义Dialog,实现各种风格效果的对话框
- Java就业面试题大全<一>
- Cocos2d入门 <七> 游戏结束
- 网络安全基础篇之<七>
- 黑马程序员 Java基础<七>---> 集合框架
- 黑马程序员 JAVA增强<七> class类
- 程序员_Java基础之<七>-集合框架