一、题目
原题链接:160. 相交链表 - 力扣(LeetCode)
函数原型:
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB)
二、思路
判断两个链表是否相交,只要判断两个链表是否有相同的结点即可。
有两种方法:
1.暴力解法:遍历链表A的每个结点,然后遍历链表B看是否能找到链表A的结点
2.遍历指针齐步走:先遍历两个链表,计算出它们的长度和长度差。然后让较长的链表的遍历指针先走长度差个结点,这样两个链表的遍历指针就相当于齐步遍历。通过比较这两个齐步遍历的指针的结点是否相同,即可判断链表是否相交;如果当链表遍历完后也没有找到相同的结点,则说明两个链表不相交。
三、代码
本题只提供第二种方法的代码,如下:
/** * 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 lenA=0; int lenB=0; while(curA)//计算链表A的长度 { lenA++; curA=curA->next; } while(curB)//计算链表B的长度 { lenB++; curB=curB->next; } curA=headA;//遍历指针回到头结点 curB=headB;//遍历指针回到头结点 int n=abs(lenA-lenB);//链表A和链表B的长度差距 if(lenA>=lenB)//链表A长度大于等于链表B长度,链表A的遍历指针先走n个结点 { while(n--) { curA=curA->next; } } else//链表B长度大于链表A长度,链表B的遍历指针先走n个结点 { while(n--) { curB=curB->next; } } while(curA&&curB) { if(curA==curB)//找到了相同的结点 return curA; else { curA=curA->next; curB=curB->next; } } return NULL;//两个链表遍历完没有发现相同的结点,说明不相交,返回空 }