求两个单链表的第一个公共节点。
分析:
两个链表的第一个公共节点之后的部分相同(完全重合)
1.当两个单链表A、B长度相等时,对两个单链表同时进行遍历,若节点不相等,则指针分别指向下一个节点;当A链表的指针等于B链表的指针时,该节点即为第一个公共节点。
2.当两个单链表A、B长度不相等时,假设B为两个链表中较长的一个,其长度为M,A链表的长度为N,则M>N;则B链表的前M-N个节点的不可能存在公共节点,对其前M-N个节点进行遍历,使其后半部分的长度和A链表的长度想的,其长度为N,此时两个链表长度相等,采用步骤1中的思路进行同时遍历。
时间复杂度为O(M+N),即为O(M);
代码如下:
struct ListNode
{
int val;
ListNode* next;
ListNode(int x):val(x),next(NULL){}
};
class Solution
{
public:
//求单链表的长度
int listLength(ListNode* head)
{
int n=0;
while(head)
{
n++;
head=head->next;
}
return n;
}
//求第一个公共节点
ListNode* FirstCommonNode(ListNode* headA,ListNode* headB)
{
int Alength=listLength(headA);//求A链表的长度
int Blenght=listLength(headB);//求B链表的长度
if(Alength>Blength)
{
swap(headA,headB);将B置为长链表
swap(Alength,Blength);
}
//将B前Blength-Alength个节点空转
for(int i=0;i!=Blength-Alength;i++)
{
headB=headB->next;
}
//两个个指针同时遍历
while(headA)
{
if(headA==headB)
return headA;//若两个节点相等,则返回该节点
headA=headA->next;
headB=headB->next;
}
return NULL;
}