一.题目
二.思路
1.如何判断两个链表是不是相交链表?
最后一个节点相交,即说明两个链表相交,否则链表不相交,返回NULL。
2.如果两个链表相交,怎么确定相交的起始节点?
这里我们再次用到快慢指针,快指针遍历长链表上长链表与短链表的长度差个节点处,再让快指针和慢指针同时遍历,直到两指针的val值相等。
3.假设法
这道题我们利用一下假设法,扩展一下思维。
想法:在我们不知道A链表和B链表究竟哪个长度长的情况下,我们可以先假设A链表的长度长,B链表的长度短,如果实际情况与假设不符再更改假设。
实现:
(1)创建两个指针:LongList(表示长链表)指向A链表的头节点headA,SortList(表示短链表)指向B链表的头节点headB。
(2)如果B链表比A链表的长度长,将LongList和SortList所指向的对象调换。
struct ListNode* LongList = headA;
struct ListNode* SortList = headB;
if(n1 < n2)
{
LongList = headB;
SortList = headA;
}
三.参考代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
int n1 = 1;
int n2 = 1;
struct ListNode* curA = headA;
struct ListNode* curB = headB;
while(curA->next)
{
curA = curA->next;
++n1;
}
while(curB->next)
{
curB = curB->next;
++n2;
}
if(curA != curB)
{//尾节点不相等就不相交
return NULL;
}
//长的先走差距步,再同时走,第一个相等的就是交点
int num = abs(n1 - n2);
struct ListNode* LongList = headA;
struct ListNode* SortList = headB;
if(n1 < n2)
{
LongList = headB;
SortList = headA;
}
while(num--)
{
LongList = LongList->next;
}
while(LongList != SortList)
{
LongList = LongList->next;
SortList = SortList->next;
}
return LongList;
}