编写一个程序,找到两个单链表相交的起始节点。
注意:
如果两个链表没有交点,返回 null.
在返回结果后,两个链表仍须保持原有的结构。
可假定整个链表结构中没有循环。
程序尽量满足 O(n) 时间复杂度,且仅用 O(1) 内存。
思考:本题 的本意是检查两链表的重叠部位对于结题来说就是两链表指针相等,并非数字。题目要求空间复杂度为O(1)。
由题目我们能够知道判断链表指针相等即可,
评论区大佬优雅的版本太佩服了,关于代码的解释就是利用指针的跳转消除两个指针之间的距离,第一次循环过后两个指针会出现在另一条链表上并处在距离结尾相同的位置,从而开始第二次的匹配过程。
本题写下来记录给自己,希望自己有一天也能代码成诗
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
if (!headA || !headB) {
return NULL;
}
ListNode *you = headA, *she = headB;
while (you != she) { // 若是有缘,你们早晚会相遇
you = you ? you->next : headB; // 当你走到终点时,开始走她走过的路
she = she ? she->next : headA; // 当她走到终点时,开始走你走过的路
}
// 如果你们喜欢彼此,请携手一起走完剩下的旅程(将下面这个 while 块取消注释)。
// 一路上,时而你踩着她的影子,时而她踩着你的影子。渐渐地,你变成了她,她也变
// 成了你。
/* while (she) {
you = she->next;
she = you->next;
} */
return you;
}
};
自己的版本。算了,我先把两个长度求了出来,然后将指针移动到对应位置,然后开始对比。理解很直接就是比较长