原题如下所示:
两个链表的交叉
请写一个程序,找到两个单链表最开始的交叉节点。
注意事项
- 如果两个链表没有交叉,返回
null
。 - 在返回结果后,两个链表仍须保持原有的结构。
- 可假定整个链表结构中没有循环。
下列两个链表:
A: a1 → a2
↘
c1 → c2 → c3
↗
B: b1 → b2 → b3
在节点 c1 开始交叉。
1、首先排除特殊情况,如果两个链表有一个为空或者都为空,则返回NULL;
2、两个链表不为空的时候,先求出两个链表的长度,如果一样长,则比较好办,两个指针从A,B的头结点往后移进行比较即可,如果不一样长,则先把长的链表往后移,移到和短的链表一样长的位置开始,同样重复之前的步骤,一起往后移进行对比;
3、在计算链表长度的时候,有一个点,就是最后指针都指向的是链表最后的节点,如果此时两个指针不相等,则两个链表一定没有交点。
具体的C++代码如下:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
/**
* @param headA: the first list
* @param headB: the second list
* @return: a ListNode
*/
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
// write your code here
if(headA==NULL||headB==NULL)
{
return NULL;
}
ListNode *p1=headA;
int l1=0;
while(p1->next!=NULL)
{
l1++;
p1=p1->next;
}
ListNode *p2=headB;
int l2=0;
while(p2->next!=NULL)
{
l2++;
p2=p2->next;
}
if(p1!=p2)
{
return NULL;
}
p1=headA;
p2=headB;
int i;
if(l1<l2)
{
for(i=0;i<l2-l1;i++)
{
p2=p2->next;
}
}
else if(l1>l2)
{
for(i=0;i<l1-l2;i++)
{
p1=p1->next;
}
}
while(p1!=p2)
{
p1=p1->next;
p2=p2->next;
}
return p1;
}
};