题目
解题思路
双指针法
创建两个指针pA和pB,分别初始化为链表A和B的头结点,然后向后逐节点遍历。
- 当pA到达链表A尾部时,将其重定位到链表B的头结点;类似的,当pB到达链表B尾部时,将其重定位到链表A的头结点。
- 若某一时刻pA和pB相遇,则该节点就是第一个公共结点。
- 若两个链表存在相交,则末尾结点必然相同,因此当pA/pB到达链表结尾时,记录下链表A/B对应的元素,不相同则说明两个链表不相交。
原理:
A和B两个链表长度可能不同,但是A+B和B+A的长度是相同的,所以遍历A+B和遍历B+A一定是同时结束。 如果A和B相交的话A和B一定有一段尾巴是相同的,所以两个遍历的指针一定会同时到达第一个交点;如果A,B不相交的话两个指针就会同时到达
null
\textbf{null}
null。
具体代码
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
ListNode p = headA, q = headB;
while(p != q){
p = p == null ? headB : p.next;
q = q == null ? headA : q.next;
}
return p;
}
}
复杂度分析
- 时间复杂度: O ( m + n ) O(m+n) O(m+n),m,n 为两个链表的长度
- 空间复杂度: O ( 1 ) O(1) O(1)