相交链表
问题:
给你两个单链表的头节点headA
和headB
,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回null
。
思路:(双指针法)
- 如果有链表为空则不会相交
- 创建两个指针指向两链表的头节点。
- 如果两节点不等则往下指。
- 当一个链表遍历到最后一个节点时,将它指向另一个链表的头节点继续遍历。
- 返回遍历的最后一个节点即为相交节点,如不相交则最后会遍历到表尾返回后一个空指针。
/**
* 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, *pB = headB;
while(pA != pB) {
pA = pA == nullptr ? headB : pA->next;
pB = pB == nullptr ? headA : pB->next;
}
return pA;
}
};
时间复杂度:O(m + n)
空间复杂度:O(1)