题目
输入两个链表,找出它们的第一个公共结点。
思路
其中一个链表转列表,遍历另一个,判断节点值是否在列表中
解答
方法一
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
class Solution:
def FindFirstCommonNode(self, pHead1, pHead2):
list1 = []
list2 = []
node1 = pHead1
node2 = pHead2
while node1:
list1.append(node1.val)
node1 = node1.next
while node2:
if node2.val in list1:
return node2.val
else:
node2 = node2.next
思路:
两根指针,先求出两条链表之差k,让长的一条先走k步,然后同步走
方法二
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
class Solution:
def FindFirstCommonNode(self, pHead1, pHead2):
p = pHead1
q = pHead2
while p and q:
# 当两个链表一样长的时候
if p == q:
return p
p = p.next
q = q.next
if p:
return self.findequal(q, p, pHead2, pHead1)
else:
return self.findequal(p, q, pHead1, pHead2)
def findequal(self, shortPointer, longPointer, shorthead, longhead):
k = 0
# 寻找出链表长度之差k
while longPointer:
longPointer = longPointer.next
k += 1
# 让长的先走k步
shortPointer = shorthead
longPointer = longhead
for i in range(k):
longPointer = longPointer.next
while shortPointer != longPointer:
shortPointer = shortPointer.next
longPointer = longPointer.next
return shortPointer.val