题目描述
输入两个链表,找出它们的第一个公共结点。
思路:
1. 首先遍历两个链表,分别求出链表的长度,下图中链表长度分别为6和4。
2. 然后p在长链表上走2步(到p’)
3. 随后p’、q从x和c同时出发,向后遍历直到找到相同的节点e。
时间复杂度为O(m+n),m,n为链表的长度。
Java 代码:
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
// 求链表的长度
public static int getLength(ListNode head) {
int length = 0;
while(head != null) {
head = head.next;
length++;
}
return length;
}
public ListNode FindFirstCommonNode(ListNode head1, ListNode head2) {
if(head1 == null || head2 == null) {
return null;
}
// Step1. 第一步求出两个链表的长度
int len1 = getLength(head1);
int len2 = getLength(head2);
// Step2. 谁长谁先走
while(len1 > len2) {
head1 = head1.next;
len1--;
}
while(len1 < len2) {
head2 = head2.next;
len2--;
}
// Step3. 两个一起走,直到公共节点
while(head1 != null && head2 != null) {
if(head1 == head2) {
return head1;
}
head1 = head1.next;
head2 = head2.next;
}
return null;
}
}
Python 代码:
# -*- coding:utf-8 -*-
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def GetLength(self, head):
length = 0
while head:
length += 1
head = head.next
return length
def FindFirstCommonNode(self, pHead1, pHead2):
# write code here
len1 = self.GetLength(pHead1)
len2 = self.GetLength(pHead2)
while len1 > len2:
pHead1 = pHead1.next
len1 -= 1
while len1 < len2:
pHead2 = pHead2.next
len1 += 1
while pHead1 and pHead1 is not pHead2:
pHead1 = pHead1.next
pHead2 = pHead2.next
return pHead1
扩展题目:
求两个树节点的最低公共祖先