题目:
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。
题目分析:
解决这道题,我们的常规思路就是暴力求解,A链表每个节点依次去跟B链表的所有节点比较,如果有相同就是交点,如果没有就是不相交。但是其实在此基础上还是有优化思路的:可以分别求出A和B的长度,lenA和lenB,让长的链表先走|lenA-lenB|,再同时走找交点。
代码实现:
/**
* 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 lenB = 0,lenA = 0;
while(curA)
{
lenA++;
curA = curA->next;
}
while(curB)
{
lenB++;
curB = curB->next;
}
struct ListNode* longList = headA;
struct ListNode* shortList = headB;
if(lenB>lenA)
{
longList = headB;
shortList = headA;
}
//让长的先走差距步
int gap = abs(lenA-lenB);
while(gap--)
{
longList = longList->next;
}
//同时走,找交点
while(longList && shortList)
{
if(longList == shortList)
{
return longList;
}
longList = longList->next;
shortList = shortList->next;
}
//不相交
return NULL;
}