单链表刷题——160.相交链表
(160.相交链表)[160. 相交链表 - 力扣(LeetCode) (leetcode-cn.com)]
相交链表也是链表届的一种特别经典的一种题目了。
较好的算法
下面是我们应该想到的一种非暴力算法的一种算法。这种方法应该想到,也不太难。
- 先分别计算两个链表的长度
- 让长的先走两个链表的长度查个单位
- 之后再进行判断
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
if(headA==NULL||headB==NULL)
return NULL;
struct ListNode *curA=headA,*curB=headB;
int lenA=0,lenB=0;
//计算长度
while(curA)
{
lenA++;
curA=curA->next;
}
while(curB)
{
lenB++;
curB=curB->next;
}
//找出较长的链表
struct ListNode *longList=headA,*shortList=headB;
if(lenA<lenB)
{
longList=headB;
shortList=headA;
}
int gap=abs(lenA-lenB);
//让链表先走长度差个单位
while(gap--&&longList)
{
longList=longList->next;
}
//判断是否相同
while((longList!=shortList)&&shortList&&longList)
{
longList=longList->next;
shortList=shortList->next;
}
return longList;
}