链表的第一个公共节点python

链表的第一个公共节点

思路
假设两个链表是单链表。那么公共节点之后的链表一定是重合的,也就是说,两个链表的有一节尾巴是一样的。
解决上述问题的方法就是,先求出两个链表的长度,分别是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)     
发布了26 篇原创文章 · 获赞 12 · 访问量 2942

猜你喜欢

转载自blog.csdn.net/m0_38126296/article/details/91413945
今日推荐