编写一个程序,找到两个单链表相交的起始节点。
例如,下面的两个链表:
在节点 c1 开始相交。
注意:
如果两个链表没有交点,返回 null.
在返回结果后,两个链表仍须保持原有的结构。
可假定整个链表结构中没有循环。
程序尽量满足 O(n) 时间复杂度,且仅用 O(1) 内存。
public class GetIntersectionNode {
@Test
public void getIntersectionNodeTest() {
ListNode headC = new ListNode(new int[] {1,2,3});
ListNode headA = new ListNode(new int[] {4,5});
ListNode headB = new ListNode(new int[] {6,2,3});
headA.next.next = headC;
headB.next.next.next = headC;
Assert.assertTrue(ListNode.compareTwoListNode(headC, getIntersectionNode(headA, headB)));
}
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if (headA == null || headB ==null) {
return null;
}
ListNode iteratorA = headA;
ListNode iteratorB = headB;
boolean flagA = false;
boolean flagB = false;
while (iteratorA != null && iteratorB != null) {
if (iteratorA == iteratorB ) {
return iteratorA;
}
iteratorA = iteratorA.next;
iteratorB = iteratorB.next;
if (flagA && flagB && iteratorA == null && iteratorB == null) {
break;
}
if (iteratorA == null) {
iteratorA = headB;
flagA = true;
}
if (iteratorB == null) {
iteratorB = headA;
flagB = true;
}
}
return null;
}
}