题目如下:
解题过程如下:
相交链表只可以在中间任意位置/头/尾结点相交,如下图:
一个next指针只能指向一块地址,所以不会出现这种情况:
在返回相交链表的起始结点之前先要判断两个链表是否相交,分析下列两种方法是否可行?
-
遍历两个链表,判断结点(地址)是否相同。如果像示例1一样,两个链表的长度不等,代码运行结果就是两个链表不会相交,这与事实恰恰相反。所以这个方法不可行:
-
看两个链表的尾结点(地址)是否相同。参考相交链表的三种情况,尾结点相同那么两个链表就一定相交。
那么怎么返回相交链表的起始结点呢?
思路:求两个链表的长度,长链表先走长度差步,长短链表遍历比较结点的地址是否相同。
完整代码如下:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
typedef struct ListNode ListNode;
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
//求两个链表的长度
ListNode* pa = headA;
ListNode* pb = headB;
int sizeA = 0;
int sizeB = 0;
while (pa)
{
++sizeA;
pa = pa->next;
}
while (pb)
{
++sizeB;
pb = pb->next;
}
//长链表先走长度差(gap)步
int gap = abs(sizeA - sizeB);
ListNode* shortList = headA;
ListNode* longList = headB;//假设B是长链表
if (sizeA > sizeB)
{
shortList = headB;
longList = headA;
}
while (gap--)
{
longList = longList->next;
}
//长短链表遍历结点的地址是否相同
while (longList) //等同于shortList != NULL
{
if (longList == shortList)
return longList;
longList = longList->next;
shortList = shortList->next;
}
return NULL;
}
abs()函数用于求绝对值: