前言
路漫漫及修远兮。
一、题链接
题意
编写一个程序,找到两个单链表相交的起始节点。
如下面的两个链表:
在节点 c1 开始相交。
例题一:
例题二:
题思路
这个题用到了快慢指针,快慢指针的内容我在上一篇文章中说到了,有兴趣的可以看一下呀,言归正传。
我们先算出这两条链表节点数的差,然后再让长的链表先走那个差的步数,然后两链表一起走,如果有节点相同的就是相交的节点,如果没有就走到NULL。
我们先要定义两个指针,分别是slow和fast来指向这两条链表的头节点。
struct ListNode*slow=headA;
struct ListNode*fast=headB;
这样为slow和fast赋值,我们怎么知道哪条链表长或者哪条链表短呢?
嘿嘿,有一个妙招,这样写可读性强。
if(lenA>lenB)
{
fast=headA;
slow=headB;
}
然后开始计算差,定义两个整形变量来计算,和两个指针指向头节点来迭代
struct ListNode*curA=headA;
struct ListNode*curB=headB;
int lenA=0,lenB=0;
然后就开始实现代码了
注意:
我们要考虑链表空的时候。
题代码
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB)
{
struct ListNode*slow=headA;
struct ListNode*fast=headB;
struct ListNode*curA=headA;
struct ListNode*curB=headB;
if(headA==NULL||headB==NULL)
{
return NULL;
}
int lenA=0,lenB=0;
while(curA)
{
curA=curA->next;
lenA++;
}
while(curB)
{
curB=curB->next;
lenB++;
}
int gap = abs(lenA-lenB);
if(lenA>lenB)
{
fast=headA;
slow=headB;
}
while(gap--)
{
fast=fast->next;
}
while(fast)
{
if(fast!=slow)
{
slow=slow->next;
fast=fast->next;
}
else
{
return fast;
}
}
return NULL;
}
总结
希望可以给你们帮助,谢谢点的赞。