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

思路:解法1,直接蛮力解,遍历两个链表,时间复杂度O(mn)

           解法2.分析两个链表,两个链从第一个公共结点开始到链尾的结点是完全重合的,(链结构性质已经决定了该属性),所以从链尾开始比较,比到第一个不相同的结点就找到了第一个公共点。时间复杂度O(m+n),空间复杂度O(m+n),(存放链表的两个栈总空间m+n,第一次存放栈的时间max(m,n),第二次比较栈内元素的时间min(m,n),所以总时间复杂度为O(m+n)).

            解法3:计算出两个链表的长度,然后长的先走几步达到和短的一样长度,然后再一起走,那么时间复杂度为O(m+n),(遍历两个链表长度的时间为m+n,比较链表时间为max(m,n),所以总时间为m+n+max(m,n),这是线性的增长,所以最后的复杂度为O(m,n))所以这种最好。

class LinkNode(object):
    def __init__(self,key = None,next = None):
        self.key = key
        self.next = next
def getLen(Link):
    if Link.key is None:
        return None
    count = 1
    while Link.next:
        Link = Link.next
        count += 1
    return count
def getFirstCommonNode(Link1,Link2):
    if Link1.key is None or Link2.key is None:
        return None
    len_1 = getLen(Link1)
    len_2 = getLen(Link2)
    diff = len_1 - len_2
    long_link = Link1
    short_link = Link2
    if len_1 < len_2:
        diff = len_2 - len_1
        long_link = len_2
        short_link = len_1
    for i in range(diff):
        long_link = long_link.next
    while long_link.key is not None and short_link.key is not None and long_link.key != short_link.key:
        long_link = long_link.next
        short_link = short_link.next
    return long_link.key


A = LinkNode()
B = LinkNode()
C = LinkNode()
D = LinkNode()
E = LinkNode()
F = LinkNode()
G = LinkNode()


A.key = 1
A.next = B
B.key = 2
B.next = C
C.key = 3
C.next = F
D.key = 4
D.next = E
E.key = 5
E.next = F
F.key = 6
F.next =G
G.key =7


print getFirstCommonNode(A,D)

阅读更多
个人分类: 算法
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭