题目描述
输入两个链表,找出它们的第一个公共结点
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
分析
公共结点是地址相同的两个结点,也就是同一个结点,由于是单向链表,所有从公共结点之后两链表重合,其拓扑结构为Y型。
例如:链表一:9,2,7,8;链表二:1,2,9,2,7,8。从元素9开始两个链表开始重合,两个链表尾部重合。
方法一代码
先计算两个链表的长度,计算两个链表的长度差,让较长的链表先走,直到与较短链表一样的长度,然后二者同时移动,找出首次value相同的元素。
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
int len1 = listLength(pHead1);
int len2 = listLength(pHead2);
if(len1>len2){
pHead1 = walkSearch(pHead1,len1-len2);
}else{
pHead1 = walkSearch(pHead2,len2-len1);
}
while(pHead1 != nullptr){
if(pHead1 == pHead2)
return pHead1;
pHead1 = pHead1->next;
pHead2 = pHead2->next;
}
return 0;
}
int listLength(ListNode* pHead){
if(pHead==nullptr)
return 0;
int length = 0;
while(pHead){
pHead = pHead->next;
length++;
}
return length;
}
ListNode* walkSearch(ListNode* pHead,int walkNumber){
for(int i=1;i<=walkNumber;i++){
pHead = pHead->next;
}
return pHead;
}
};
方法二代码
将两个链表L1和L2进行拼接,得到L1+L2和L2+L1两个拼接结果。这两个拼接后的链表长度是一致的,那么逐个判断即可。
也就是说,设置两个指针分别指向两L1和L2(设L1比L2长),指向L1的指针走完,指向L2;指向L2的指针走完,指向L1。当第二遍走的时候,一定会在交点相遇。
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2)
{
ListNode *p1 = pHead1;
ListNode *p2 = pHead2;
while(p1!=p2)
{
p1 = (p1==NULL? pHead2 : p1->next);
p2 = (p2==NULL? pHead1 : p2->next);
}
return p1;
}
};
2018.11.27 21:43
by
陈实Yepper