一原题
Intersection of Two Linked Lists
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.
Credits:
Special thanks to @stellari for adding this problem and creating all test cases.
二 分析
先计算连个链表的长度LA和LB,他们的差是dif=abs(LA-LB);用两个指针分别指向链表头,先让指向较长链表的指针沿着的链表走dif个节点,之后两个指针一起沿着链表走,当他们指向的节点相同时(val相同&&.next相同),这个节点就是intersection。时间复杂度O(n),空间复杂度O(1)。
三 代码(java)
/**
* 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;
ListNode temp1,temp2;
int count1,count2,dif;
count1=1;count2=1;dif=0;
temp1=headA;
temp2=headB;
while(temp1.next!=null){
temp1=temp1.next;
count1++;
}
while(temp2.next!=null){
temp2=temp2.next;
count2++;
}
if(temp1.val!=temp2.val)
return null;
else
{
temp1=headA;
temp2=headB;
dif=Math.abs(count1-count2);
if(count1>count2){
while(dif>0){
temp1=temp1.next;
dif--;
}
while(count2>0){
if((temp1.val==temp2.val)&&(temp1.next==temp2.next))
return temp1;
temp1=temp1.next;
temp2=temp2.next;
}
}
else{
while(dif!=0){
temp2=temp2.next;
dif--;
}
while(count1>0){
if((temp1.val==temp2.val)&&(temp1.next==temp2.next))
return temp1;
temp1=temp1.next;
temp2=temp2.next;
}
}
return null;
}
}
}