题目描述
输入两个链表,找出它们的第一个公共结点。
思路:第一个公共的结点,意味着从该结点往后,两个列表的结点都相同。
C++实现:
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
ListNode *a, *b;
a = pHead1;
b = pHead2;
if(a == NULL or b == NULL)
return NULL;
int t1 = 0, t2 = 0;
while(a)
{
t1 = t1 + 1;
a = a -> next;
}
while(b)
{
t2 = t2 + 1;
b = b -> next;
}
ListNode *p1, *p2;
p1 = pHead1;
p2 = pHead2;
if(t1 > t2)
{
for(int i = 0; i < t1 -t2; i ++)
p1 = p1 -> next;
}
else if(t1 < t2)
{
for(int i = 0; i < t2 - t1; i ++)
p2 = p2 -> next;
}
while(p1 != NULL and p2 != NULL)
{
if(p1 -> val == p2 -> val)
return p1;
p1 = p1 -> next;
p2 = p2 -> next;
}
return NULL;
}
};
python实现:
# -*- coding:utf-8 -*-
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def FindFirstCommonNode(self, pHead1, pHead2):
# write code here
a = pHead1
b = pHead2
if a == None or b == None:
return None
r1 = []
r2 = []
while a:
r1.append(a)
a = a.next
while b:
r2.append(b)
b = b.next
for i in range(0, len(r1)):
for j in range(0, len(r2)):
if r1[i] == r2[j]:
return r1[i]
return None