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.
如果存在intersection,那么A与B最后一定有一些值是一样的,只需截断较长的那条链表的前面abs(len(A),len(B))个元素,此时两个链表就一样长了,然后设一个指针同时往后遍历即可。
source
/**
* 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) {
int l1 = 0, l2 = 0, value;
ListNode h1 = headA;
ListNode h2 = headB;
if(h1 == null || h2 == null) return null;
while(h1.next != null){ //java中null要小写
l1++;
h1 = h1.next;
}
while(h2.next != null){
l2++;
h2 = h2.next;
}
h1 = headA;
h2 = headB;
value = Math.abs(l1 - l2);
if(l1 >= l2){
for(int i = 0; i < value;i++){
h1 = h1.next;
}
while(h1 != null && h1.val != h2.val){ //特别注意h1走到尾部的情况,下一个元素未赋初值会抛出null异常
h1 = h1.next;
h2 = h2.next;
}
if(h1 == null) return null;
else return h1;
}
else{
for(int i = 0; i < value; i++){
h2 = h2.next;
}
while(h1 != null && h1.val != h2.val){ //写的有点复杂,可以和上面合起来
h1 = h1.next;
h2 = h2.next;
}
if(h1 == null) return null;
else return h1;
}
}
}
Test
public static void main(String[] args){
ListNode a = new ListNode(1);
a.next = new ListNode(2);
a.next.next = new ListNode(3);
a.next.next.next = new ListNode(4);
ListNode b = new ListNode(6);
b.next = new ListNode(7);
ListNode c = new Solution().getIntersectionNode(a, b);
if(c != null) System.out.print(c.val);
else System.out.print("null");
}