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

85 篇文章 0 订阅
'''
题目描述
输入两个链表,找出它们的第一个公共结点。
思路一:
先求出每个链表的长度,分别为a+n和b+n
n表示两个链表公共部分的长度,从第一个公共节点向后的每个节点都是两个链表的公共节点
也就是说从第一个相同的公共节点往后的所有节点都相同
用指针1和指针2分别记录两个列表中当前感兴趣的位置索引值
则如果a>b,相当于让指针1比指针2多走a-b步,则找到第一个两个指针所指向的内容相同的地方就是两个链表的第一个公共节点
思路二:
对于链表1和链表2,将链表的每个节点分别存储到两个栈stack1和stack2中
然后从最后一个节点(即栈顶元素)开始从后向前遍历原始链表中的元素
相当于从原始的两个链表中最后一个节点开始遍历,则最后一个元素必然是两个链表最后一个公共节点
向前遍历得到的最后一个相同的节点就是(从前向后遍历两个链表的)第一个公共节点
'''
# -*- coding:utf-8 -*-
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None
class Solution:
    def FindFirstCommonNode(self, pHead1, pHead2):
        # write code here
        len_1=0
        len_2=0
        pHead1_copy=pHead1
        pHead2_copy=pHead2
        while pHead1_copy:
            len_1+=1
            pHead1_copy=pHead1_copy.next
        while pHead2_copy:
            len_2+=1
            pHead2_copy=pHead2_copy.next
        if len_1>len_2:
            start1=len_1-len_2
            # start2=0
            for i in range(start1):
                pHead1=pHead1.next
            while(pHead1!=pHead2):
                pHead1=pHead1.next
                pHead2=pHead2.next
            return pHead1
        elif len_2>len_1:
            start2=len_2-len_1
            # start1=0
            for i in range(start2):
                pHead2=pHead2.next
            while(pHead1!=pHead2):
                pHead1=pHead1.next
                pHead2=pHead2.next
            return pHead1
        else:
            while (pHead1!= pHead2):
                pHead1 = pHead1.next
                pHead2 = pHead2.next
            return pHead1

# -*- coding:utf-8 -*-
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None
class Solution:
    def FindFirstCommonNode(self, pHead1, pHead2):
        # write code here
        stack1=[]
        stack2=[]

        p1,p2=pHead1,pHead2
        while p1:
            stack1.append(p1)
            p1=p1.next
        while p2:
            stack2.append(p2)
            p2=p2.next
        while(stack1 and stack2 and stack1[-1]==stack2[-1]):
            stack1.pop(-1)
            stack2.pop(-1)
        if not stack1:
            return pHead1
        if not stack2:
            return pHead2
        return stack1[-1].next
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值