【36】两个链表的第一个公共结点
时间限制:1秒
空间限制:32768K
本题知识点: 链表
题目描述
输入两个链表,找出它们的第一个公共结点。
如测试用例:{1,2,3},{4,5},{6,7}
即,链1:12367,链2:4567.
牛客网题目链接:点击这里
VS2010代码:
#include<iostream>
using namespace std;
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
//方法一:先对齐结尾后,从前往后比较结点
class Solution {
public:
ListNode* FindFirstCommonNode( ListNode *pHead1, ListNode *pHead2) {
//链表1为空或者链表2为空,返回空
if(!pHead1 || !pHead2 ) return NULL;
//求出两个链表的长度。
int length1=0;
int length2=0;
ListNode *p1=pHead1;
ListNode *p2=pHead2;
ListNode *result=NULL;
while( p1)
{
length1++;
p1=p1->next;
}
while( p2)
{
length2++;
p2=p2->next;
}
//对齐尾部,从短的头部开始比较
p1=pHead1;p2=pHead2; //初始化
if(length1>length2)
{
int JumpStep=(length1-length2);
while(JumpStep!=0)
{
p1=p1->next;
JumpStep--;
}
}
else
{
int JumpStep=(length2-length1);
while(JumpStep!=0)
{
p2=p2->next;
JumpStep--;
}
}
//找到比较位置,开始比较
while(p1 && p2)
{
if( p1!=p2 )
{
p1=p1->next;
p2=p2->next;
}
else
{
result=p1;
break;
}
}
return result;
}
};
ListNode* CreatList(int *Array, int size)
{
if(Array==NULL || size<=0) return NULL;
ListNode* ListHead=NULL;
ListNode* pList=NULL;
pList=new ListNode(Array[0]);
ListHead=pList;
for(int i=1; i<size; i++)
{
pList->next=new ListNode(Array[i]);
pList=pList->next;
}
return ListHead;
}
int main()
{
int test1[]={1};
}
思考:
- 如何设计测试用例的公共集。
即需要同时设计两个链表 - 首次提交,提示未在规定时间内完成,是不是算法有环?
测试表明无环。是因为最后一个循环没有加break - 其他方法,如用两个栈保存节点。
或者将第一个链表尾和第二个链表头相连,采用1步2步追赶法找交点
或者将第一个链表尾和第二个链表头连接后,采用断尾法,但会破坏链表结构。
牛客网通过图片: