Write a program to find the node at which the intersection of two singly linked lists begins.
For example, the following two linked lists:
A: a1 → a2 ↘ c1 → c2 → c3 ↗ B: b1 → b2 → b3
begin to intersect at node c1.
Notes:
- If the two linked lists have no intersection at all, return
null
. - The linked lists must retain their original structure after the function returns.
- You may assume there are no cycles anywhere in the entire linked structure.
- Your code should preferably run in O(n) time and use only O(1) memory.
·初始化量个指针PA与PB,分别指向A和B的头部,每次均只能遍历一个节点
·当PA到A的末尾时,就指向B的头结点;同理,当PB到B的末尾时,就指向A的头结点。
·当PA与PB相遇时,就是AB的交叉点。若二者没有交叉点,则各自指向对方头部后的移动中,最终均指向null节点。
·可以举例子:{1,3,5,7,9,11}与{2,4,9,11}在9为交叉,那么进行上面操作时,两个指针相当于遍历的总长度是相同的。
示意图:
·时间复杂度:O(m+n)
·空间复杂度:O(1)
/**
* 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) {
while(headA==null||headB==null) return null;
ListNode a = headA;
ListNode b = headB;
while(a!=b){
a = (a==null)? headB:a.next;
b = (b==null)? headA:b.next;
}
return a;
}
}