题解 | #反转链表#

两个链表的第一个公共结点

http://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46

这道题想了46分钟,依次想到的思路如下: (1)暴力遍历所有可能性,就是两个for循环 (2)采用Hash表的方法,这种方式的空间复杂度应该是o(n) (3)双指针,没想明白怎么弄来着 (4)想到了一种基于序列长度的方法:将两个序列的尾部对齐,从左到右对齐的部分依次比较

#     def __init__(self, x):
#         self.val = x
#         self.next = None

#
# 
# @param pHead1 ListNode类 
# @param pHead2 ListNode类 
# @return ListNode类
#
import sys
import math
sys.setrecursionlimit(100000)

class Solution:

    def FindFirstCommonNode(self , pHead1 , pHead2 ):
        # write code here
        pHead1Length = 0
        pHead2Length = 0
        pHead1Shadow = pHead1
        pHead2Shadow = pHead2
        while pHead1Shadow:
            pHead1Shadow = pHead1Shadow.next
            pHead1Length += 1
        while pHead2Shadow:
            pHead2Shadow = pHead2Shadow.next
            pHead2Length += 1
        commonLength = pHead1Length if pHead1Length < pHead2Length else pHead2Length
        delta1 = pHead1Length - commonLength
        delta2 = pHead2Length - commonLength
        while pHead1 and delta1 > 0:
            pHead1 = pHead1.next
            delta1 -= 1
        while pHead2 and delta2 > 0:
            pHead2 = pHead2.next
            delta2 -= 1
        while pHead1 and pHead2:
            if pHead1.val == pHead2.val:
                return pHead1
            pHead1 = pHead1.next 
            pHead2 = pHead2.next 
        return None
            
        
                
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务