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/**
* 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) {
if(headA==null || headB==null) return null; //我用的是判断环的方法,碰撞点开始到连接点的长度=head到连接点的长度。
//一种更好的方法是线计算出2个链表的长度再移动节点。
ListNode moveA=headA;
ListNode moveB=headB;
ListNode lastA=null;
while(moveA!=null && moveA.next!=null) moveA=moveA.next;
while(moveB!=null && moveB.next!=null) moveB=moveB.next;
if(moveA!=moveB) return null;
else
{
lastA=moveA;
moveA.next=headB;
}
ListNode slow=headA.next;
ListNode fast=headA.next.next;
while(slow!=fast){
slow=slow.next;
fast=fast.next.next;
}
moveB=slow;
moveA=headA;
while(moveA!=moveB){
moveA=moveA.next;
moveB=moveB.next;
}
lastA.next=null;
return moveB;
}
}
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.
浙公网安备 33010602011771号