编写一个程序,找到两个单链表相交的起始节点。
例如,下面的两个链表:
A: a1 → a2
↘
c1 → c2 → c3
↗
B: b1 → b2 → b3
在节点 c1 开始相交。
注意:
- 如果两个链表没有交点,返回
null
. - 在返回结果后,两个链表仍须保持原有的结构。
- 可假定整个链表结构中没有循环。
- 程序尽量满足 O(n) 时间复杂度,且仅用 O(1) 内存。
题目分析:
找到两个链表相交的初始起点就是比较对应位置的元素看是否相等,但是要考虑到数组长度是否相等,先求出两个链表的长度,相等的话就从初始位置开始比较;不相等的话就要先处理长度比较长的链表,使其长度与短链表的长度相等,(即去除前面多余的一段链表),然后从初始位置开始比较。
代码实现:
public static class ListNode { int val; ListNode next; ListNode(int x) { val = x; } } public ListNode getIntersectionNode(ListNode headA, ListNode headB) { int lengthA = 0; int lengthB = 0; ListNode tempA = headA; ListNode tempB = headB; while (tempA != null) { lengthA++; tempA = tempA.next; } while (tempB != null) { lengthB++; tempB = tempB.next; } tempA = headA; tempB = headB; if (lengthB > lengthA) { int DV = lengthB - lengthA; for (int i = 0; i < DV && tempB != null; i++) { tempB = tempB.next; } } else { int DV = lengthA - lengthB; for (int i = 0; i < DV && tempA != null; i++) { tempA = tempA.next; } } while (tempA != null && tempB != null && tempA.val != tempB.val) { tempA = tempA.next; tempB = tempB.next; } return tempA; }
主函数:
public static void main(String[] args) { ListNode node1 = new ListNode(1); node1.next = new ListNode(3); node1.next.next = new ListNode(4); node1.next.next.next = new ListNode(7); node1.next.next.next.next = new ListNode(9); ListNode node2 = new ListNode(5); node2.next = new ListNode(7); node2.next.next = new ListNode(9); L2 l = new L2(); ListNode node = l.getIntersectionNode(node1, node2); try { System.out.println(node.val); }catch (Exception e) { System.out.println(e); } }
运行结果:
7