链表的第一个公共节点
思路
假设两个链表是单链表。那么公共节点之后的链表一定是重合的,也就是说,两个链表的有一节尾巴是一样的。
解决上述问题的方法就是,先求出两个链表的长度,分别是len1和len2,如果len1<len2,那么让链表2先走len2-len1步,接下来两个链表一起走,反之同理
class ListNode:
def __init__(self,x):
self.val=x
self.next=None
class Solution:
def FindFirstCommonNode(self, pHead1, pHead2):
# write code here
if pHead1 == None or pHead2 == None:
return None
p = pHead1
q = pHead2
len1,len2 = 0,0
while p != None:
len1 += 1
p = p.next
while q != None:
len2 += 1
q = q.next
print('p=%d q=%d'%(len1,len2))
if len1>len2:
while len1-len2:
pHead1 = pHead1.next
len1 -= 1
elif len1<len2:
while len2-len1:
pHead2 = pHead2.next
len2 -= 1
else:
pass
while pHead1 != None and pHead2 != None:
if pHead1 is pHead2:#用is不用==,这里很重要
return pHead1
else:
pHead1 = pHead1.next
pHead2 = pHead2.next
return None
用测试用例验证了一下
if __name__ == '__main__':
list1=ListNode(1)
list1.next=ListNode(2)
list1.next.next=ListNode(3)
list1.next.next.next=ListNode(4)
list1.next.next.next.next=ListNode(5)
list2=ListNode(0)
list2.next=ListNode(4)
list2.next.next=ListNode(5)
answer=Solution()
q=answer.FindFirstCommonNode(list1,list2)
if q == None:
print("没有")
else:
print(q.val)
得到的结果是
p=5 q=3
没有
题目的本意是找到公共节点,这就意味着两个节点是完全的相同,包括内容与地址,而==只能判断内容是否相同,不在意具体地址存储情况,但是is是两个元素完全相同,包括内容与地址
很奇怪,虽然道理是这样,但是我验证的时候发现并不是这样,讲道理第一个应该返回 True啊!!!
list1.next.next == list2
Out[25]: False
list1.next.next is list2
Out[26]: False
重新设计了测试用例,这次就对了
if __name__ == '__main__':
list1=ListNode(1)
list1.next=ListNode(2)
list1.next.next=ListNode(3)
list1.next.next.next=ListNode(4)
list1.next.next.next.next=ListNode(5)
list2=ListNode(0)
list2.next=list1.next.next
answer=Solution()
q=answer.FindFirstCommonNode(list1,list2)
if q == None:
print("没有")
else:
print(q.val)