相交链表
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。
先定义curA和curB遍历链表,看看最后一个节点是不是一个,如果是再寻找第一个相交的节点,如果不是直接返回null。

遍历时计算出各自的链表长度,然后长的链表先走两个长度的差,A、B链表再同时走第一个相等的节点就是第一个相交的节点。
代码实现如下:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
struct ListNode *curA = headA;
struct ListNode *curB = headB;
int countA = 1;
int countB = 1;
while(curA->next)
{
curA = curA->next;
countA++;
}
while(curB->next)
{
curB = curB->next;
countB++;
}
if(curA != curB)
{
return NULL;
}
int gap = abs(countA - countB);
struct ListNode* longList = headA;
struct ListNode* shortList = headB;
if(countA < countB)
{
longList = headB;
shortList = headA;
}
while(gap--)
{
longList = longList->next;
}
while(longList != shortList)
{
longList = longList->next;
shortList = shortList->next;
}
return longList;
}
这篇博客介绍了如何找到两个单链表相交的起始节点。首先分别计算两个链表的长度,然后让长度较长的链表先走它们的长度差,之后两个链表同步行走,直到找到相交的第一个节点。如果最后两个链表的末尾节点不相等,则说明链表不相交,返回null。

被折叠的 条评论
为什么被折叠?



