剑指offer ---两个链表的第一个公共结点

输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)
思路一:

  • 使用两个头结点遍历所有节点存入两个列表中
  • 找出两个列表中第一个重复的元素
  • 返回重复的元素
# 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
        nodeList1 = []
        nodeList2 = []
        
        nodePointer1 = pHead1
        nodePointer2 = pHead2
        
        while nodePointer1:
            nodeList1.append(nodePointer1)
            nodePointer1 = nodePointer1.next
        while nodePointer2:
            nodeList2.append(nodePointer2)
            nodePointer2 = nodePointer2.next
              
        for i in nodeList1:
            if i in nodeList2:
                return nodeList2[nodeList2.index(i)]

思路二:

# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None
class Solution:
    def FindFirstCommonNode(self, pHead1, pHead2):
        # write code here
		pTmp1 = pHead1
        pTmp2 = pHead2
        
        while pTmp1 and pTmp2:
            #当两个链表一样长时直接返回头结点
            if pTmp1 == pTmp2:
                return pTmp1
            pTmp1 = pTmp1.next
            pTmp2 = pTmp2.next
        
        if pTmp1:  #如果pTmp1是长的链表  k为差值即两个链表相差多少
            k = 0            
            #寻找出长度链表之间的差值
            while pTmp1:
                pTmp1 = pTmp1.next
                k += 1
                
            pTmp1 = pHead1
            pTmp2 = pHead2
            #先让长的那个走K步
            for i in range(k):
                pTmp1 = pTmp1.next

            while pTmp1 != pTmp2:
                pTmp1 = pTmp1.next
                pTmp2 = pTmp2.next
            
            return pTmp1
                
        if pTmp2:    #如果pTmp1是长的链表  k为差值即两个链表相差多少
            k = 0            
            #寻找出长度链表之间的差值
            while pTmp2:
                pTmp2 = pTmp2.next
                k += 1
            pTmp1 = pHead1    
            pTmp2 = pHead2   
            #先让长的那个走K步
            for i in range(k):
                pTmp2 = pTmp2.next

            while pTmp1 != pTmp2:
                pTmp1 = pTmp1.next
                pTmp2 = pTmp2.next
            
            return pTmp2
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值