题目描述
输入两个链表,找出它们的第一个公共结点。
1->2->3->6->7
4->5->6->7
练习地址
实现-lc
实现
方法:快慢指针,时间复杂度O(m+n)
public class C52_list_FindFirstCommonNode {
static class ListNode {
int val;
ListNode next;
ListNode(int val) {
this.val = val;
}
}
// 快慢指针实现,复杂度O(m+n)
public static ListNode FindFirstCommonNode(ListNode head1, ListNode head2) {
// 遍历得到两个链表的长度
int len1 = getLen(head1);
int len2 = getLen(head2);
int diff = len1 - len2;
ListNode headLong = head1;
ListNode headShort = head2;
if (len2 > len1) {
headLong = head2;
headShort = head1;
diff = len2 - len1;
}
// 先在长指针走,再同时走
for (int i = 0; i < diff; i++) {
headLong = headLong.next;
}
while (headLong != null && headShort != null && headLong != headShort) {
headLong = headLong.next;
headShort = headShort.next;
}
// 得到第一个公共节点
return headLong;
}
static int getLen(ListNode head) {
int len = 0;
ListNode node = head;
while (node != null) {
len++;
node = node.next;
}
return len;
}
}
Test
public static void main(String[] args) {
ListNode node1 = new ListNode(1);
ListNode node2 = new ListNode(2);
ListNode node3 = new ListNode(3);
ListNode node4 = new ListNode(4);
ListNode node5 = new ListNode(5);
ListNode node6 = new ListNode(6);
ListNode node7 = new ListNode(7);
node1.next = node2;
node2.next = node3;
node3.next = node6;
node6.next = node7;
node4.next = node5;
node5.next = node6;
node6.next = node7;
System.out.println(FindFirstCommonNode(node1, node4).val);
}