链接
题目:
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。
图示两个链表在节点 c1 开始相交:
【解题:】
利用两个指针,分别往下遍历,如果当前指针为空,则指向对方的头节点。利用路径总和相等,便可以找到交点。 为什么要这样判断,因为你要保证没有相交时,他们的共同指针是空指针,跳出循环,否则无限循环。
指针A :a+c+b ;
指针B :b+c+a ;
明显 a+c+b = b+c+a;
因而如果两个链表相交,则指针A和指针B必定在相交结点相遇。
时间复杂度为o(m+n),空间复杂度为o(1)
ListNode* getIntersectionNode(ListNode* headA, ListNode* headB) {
if (headA == nullptr || headB == nullptr)return nullptr;
ListNode* left = headA;
ListNode* right = headB;
while (left != right) {
if (left) {
left = left->next;
}
else if (left == nullptr) {
left = headB;
};
if (right) {
right = right->next;
}
else if (right == nullptr) {
right = headA;
};
if (left) {
cout << "left:" << left->val << endl;
}
else {
cout << "left: None" << endl;
}
if (right) {
cout << "right:" << right->val << endl;
}
else {
cout << "right: None" << endl;
}
}
return left;
}
#include<iostream>
#include<vector>
using namespace std;
struct ListNode
{
int val;
ListNode* next;
ListNode(int val):val(val),next(nullptr){}
};
ListNode* getIntersectionNode(ListNode* headA, ListNode* headB) {
if (headA == nullptr || headB == nullptr) {
return nullptr;
}
ListNode* pA = headA, * pB = headB;
while (pA != pB) {
pA = pA == nullptr ? headB : pA->next;
pB = pB == nullptr ? headA : pB->next;
}
return pA;
}
int main() {
ListNode* headA = new ListNode(5);
headA->next = new ListNode(3);
headA->next->next = new ListNode(8);
ListNode* headB = new ListNode(2);
headB->next = headA->next->next;
cout << getIntersectionNode(headA, headB)->val << endl;;
}