原题链接:相交链表
题意
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。
图示两个链表在节点 c1 开始相交:
思路
- 倘若两个链表有交点,那么满足以上示意图
- a为链表1到达交点的步数
- c为链表2到达交点的步数
- b为交点到达终点的步数
- 令链表1每次走一步,到达终点时(此时走了a+b),从链表2的头结点起步
- 令链表2每次走一步,到达终点时(此时走了b+c),从链表1的头结点起步
- 那么,他们到达结点的时候,都走了a+b+c步,因此可以判断是否到达了结点
该思路的时间复杂度: O ( m + n ) O(m + n) O(m+n),空间复杂度: O ( 1 ) O(1) O(1)
代码
/**
* 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) {
auto pa=headA;
auto pb=headB;
while(pa!=pb)
{
if(pa) pa=pa->next;//如果不为空一直往后走
else pa=headB;//切换到另一个链表
if(pb) pb=pb->next;
else pb=headA;
}
return pa;
}
};