题目:
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。
图示两个链表在节点 c1 开始相交:
题目数据 保证 整个链式结构中不存在环。
注意,函数返回结果后,链表必须 保持其原始结构 。
思路:
若无交点,则尾部相遇;若有,则相交节点处相遇。
C++:
#include<iostream>
#include<vector>
using namespace std;
struct ListNode
{
int val;
ListNode *next;
}
class Solution
{
public:
ListNode *getIntersectionNode(ListNode *headA,ListNode *headB)
{
// 若两单链表至少有一个为空,则不存在相交节点,返回nullptr
if(headA == nullptr || headB == nullptr) return nullptr;
// 定义两个指针,分别指向两个单链表的头结点
ListNode *pA = headA;
ListNode *pB = headB;
// 在两个链表相遇之前,持续遍历两个单链表
while(pA != pB)
{
if(pA==nullptr) // 如果单链表A遍历结束
{
pA = headB; // 将pA指向单链表B的头结点
}
else
{
pA = pA->next; // 否则继续遍历
}
if(pB==nullptr) // 如果单链表B遍历结束
{
pB = headA; // 将pB指向单链表A的头结点
}
else
{
pB = pB->next; // 否则继续遍历
}
}
// 两指针相遇后,相遇点即为两个单链表的相交节点
return pA;
}
}
python:
思路同上;
class Solution(object):
def getIntersectionNode(self,headA,headB):
cur1 = headA
cur2 = headB
while cur1 != cur2:
if cur1:
cur1 = cur1.next
else:
cur1 = headB
if cur2:
cur2 = cur2.next
else:
cur2 = headA
return cur1