1. 问题描述
给定两个单链表,查找这两个单链表的交叉节点。例如:链表listA为: a1→a2→c1→c2→c3 ,链表listB为: b1→b2→b3→c1→c2→c3 。那么这两个的第一个交叉节点为 c1 。
2. 方法与思路
首先,观察一下交叉节点的特点。如果两个链表有交叉节点的话,那么这个交叉节点之后的其他节点都是相同的,也就是说两个链表的结构应该是
Y
字型的。
也就是说,
时间复杂度
O(n)
,空间复杂度
O(1)
。
c++代码如下:
//求出链表长度
int getListLength(ListNode *head)
{
int len = 0;
ListNode *tmp = head;
while(tmp) tmp = tmp->next,len++;
return len;
}
//判断交叉节点
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
ListNode *a = headA, *b = headB;
int ab = getListLength(a)-getListLength(b);
if(ab > 0)
{
while(ab) a = a->next, ab--;
}
else if(ab < 0)
{
while(ab) b = b->next, ab++;
}
while(a && b)
{
if(a->val == b->val) return a;
a = a->next;
b = b->next;
}
return NULL;
}