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.
思路:用floyd判圈法,可以判断是否有交点,环的起点和环长度,参照https://en.wikipedia.org/wiki/Cycle_detection#Tortoise_and_hare
代码如下:
class ListNode
{
int val;
ListNode next;
ListNode(int x) { val = x; next = null;}
}
class Solution
{
public ListNode getIntersectionNode(ListNode headA, ListNode headB)
{
if (null == headA) return null;
ListNode pa = headA;
while (pa.next != null)
{
pa = pa.next;
}
pa.next = headB;
ListNode fast = headA;
ListNode slow = headA;
boolean found = false;
while (fast != null && slow != null)
{
if (fast.next != null)
{
fast = fast.next.next;
}
else break;
slow = slow.next;
if (fast == slow)
{
found = true;
break;
}
}
if (!found)
{
pa.next = null;
return null;
}
fast = headA;
while (fast != slow)
{
fast = fast.next;
slow = slow.next;
}
return slow;
}
}