题目描述
编写一个程序,找到两个单链表相交的起始节点。
如下面的两个链表:
题解
创建两个指针 pa 和 pb,分别初始化为链表 A 和 B 的头结点。然后让它们向后逐结点遍历。
当 pa到达链表A的尾部时,将它重定位到链表 B 的头结点;
当 pb 到达链表的尾部时,将它重定位到链表 A 的头结点。
若在某一时刻 pa和 pb 相遇,则 pa/pb 为相交结点。(这种情况默认链交点后面的元素一样。若输入A=[1,3,5], B=[3,4] 则不满足要求)
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
if(!headA || !headB) return nullptr;
ListNode* pa = headA;
ListNode* pb = headB;
while(pa!=pb){
if(pa != nullptr) pa = pa->next;
else pa = headB;
if(pb != nullptr) pb = pb->next;
else pb = headA;
}
return pa;
}
};
复杂度分析
- 时间复杂度: O(m+n),m,n分别为链表A,B长度。
- 空间复杂度: O(1)。
参考
交叉链表-循环指针相遇
160. 相交链表 C++ 三种方法 暴力法、hashset法、双指针法
Intersection of Two Linked Lists (双指针,链表拼接)
你用浪漫的方式找到两个单链表相交的起始节点