题目描述:160. 相交链表 - 力扣(LeetCode)
给你两个单链表的头节点
headA
和headB
,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回null
。
注:本题中链表相交是“Y”型的,而不是“X”型的,因为本题是单链表,每一个节点中只有一个指针域,也就意味着一个节点只能指向一个节点。
题解思路:
- 判断两链表最后一个节点是否为同一个节点(节点地址是否相同):如果是同一个节点,则两链表相交,找到相交起点的节点;如果不是同一个节点,两链表不相交,返回NULL;
- 分别遍历两链表得到两个链表的节点个数count1、count2;
- 找到相交起点的节点:用两个指针cur1、cur2指向两链表的头节点,先让较长链表cur向后移动(count1-count2)绝对值个数的节点,然后同时向后移动,当 cur1 和 cur2 指向节点的地址相同时,这个节点就是相交节点的起点。
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB)
{
int count1 = 0, count2 = 0;
struct ListNode * cur1 = headA, *cur2 = headB;
struct ListNode * longList = headA;
struct ListNode * shirtList = headB;
while(cur1)
{
count1++;
cur1 = cur1->next;
}
while(cur2)
{
count2++;
cur2 = cur2->next;
}
if(cur1 != cur2)
{
return NULL;
}
else
{
// 找到相交起点
if(count1<count2)
{
longList = headB;
shirtList = headA;
}
int temp = abs(count1-count2);
while(temp--)
{
longList = longList->next;
}
while(longList != shirtList)
{
longList = longList->next;
shirtList = shirtList->next;
}
}
return shirtList;
}
本次内容到此结束了!如果你觉得这篇博客对你有帮助的话 ,希望你能够给我点个赞,鼓励一下我。感谢感谢……