思路:
做链表题,没事想想双指针!
想要找到第一个相交节点,自然是思考顺着找还是倒着找啦!
- 倒着找:
倒着?递归!
找?find?哈希表!
哈哈!开玩笑。
A链表用于存储,B链表一个一个对照就可以了。
如果使用哈希表,空间就不是o(1)了。题目告诉我们:
进阶:你能否设计一个时间复杂度 O(n)
、仅用 O(1)
内存的解决方案?
- 顺着找:
真不好找!思考一下倒着为什么能找到?因为倒着找保证了A,B链表(齐头并退)齐头并进。
顺着为什么不能?因为距离第一个相交节点的距离不同。没有条件?那我们就要创造条件!
如果知道了两个链表的长度,减去多余部分,就可以齐头并进了!
代码如下:
class Solution { public: ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) { ListNode* a=headA; ListNode* b=headB; int lena=0,lenb=0; while(a){ lena++; a=a->next; } while(b){ lenb++; b=b->next; } a=headA,b=headB; while(lena>lenb){ lena--; a=a->next ; } while(lenb>lena){ lenb--; b=b->next ; } while(a){ if(a==b){ return a; } a=a->next; b=b->next; } return NULL; } };