题目:链接
用数组的思维来想这一道题,其实就是在寻找两个数组中第一个相同的元素,并返回这个元素.但链表不同于数组,只能参考大致思路.
读题理解如下
- 链表在相交后,在相交节点后面的元素一定是相同的
- 当两个表长度相同时,只需分别遍历比对即可
- 由理解2可知,算出两个链表的长度并求出差值,使较长的链表先走差值步与另一个短链表平齐
- 只要两个节点地址不同,就继续遍历,否则返回相交节点
由理解1和链表的定义(因为c1如果要找前一个元素能找到两个)可知不存在这样的结构
思路:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
struct ListNode * tailA=headA,*tailB=headB;
struct ListNode * curA=headA,*curB=headB;
int lengthA=0,lengthB=0;
//求长度算差距值
while(tailA)
{
tailA=tailA->next;
lengthA++;
}
while(tailB)
{
tailB=tailB->next;
lengthB++;
}
//尾节点一定相同,否则就不是相交
if(tailA!=tailB)
{
return NULL;
}
int gap=abs(lengthA-lengthB);
while(gap--)
{
if(lengthA>lengthB)
{
curA=curA->next;
}
else{
curB=curB->next;
}
}
while(curA!=curB)
{
curA=curA->next;
curB=curB->next;
}
return curA;
}
此处时间复杂度为O(N),空间复杂度为O(1)