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

原创 2018年04月16日 00:24:26

思路:解法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)

题目:输入两个链表,找出它们的第一个公共结点

题目:输入两个链表,找出它们的第一个公共结点。链表的定义如下: struct ListNode {      int m_nValue;      ListNode* m_pNext; };...
  • yanxiaolx
  • yanxiaolx
  • 2016-08-05 20:59:35
  • 2877

算法题5 找出两个链表的第一个公共结点

题目:两个单向链表,找出它们的第一个公共结点。 链表的结点定义为: struct ListNode {       int       m_nKey;       ListNode*   m...
  • wcyoot
  • wcyoot
  • 2011-05-17 11:21:00
  • 13421

【链表】C++两个链表的公共结点

题目:(剑指offer编程题)输入两个单向链表,找出它们的第一个公共结点。 公共结点是地址相同的两个结点,也就是同一个结点,由于是单向链表,所有从公共结点之后两链表重合。 思路: 方法1:最容易想到...
  • yebanxin
  • yebanxin
  • 2016-07-17 19:20:10
  • 1167

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

题目:输入两个链表,找出它们的第一个公共结点。 面试的时候碰到这道题,很多应聘者的第一反应就是蛮力法:在第一链表上顺序遍历每个结点,没遍历到一个结点的时候,在第二个链表上顺序遍历每个结点。如果在第二...
  • samjustin1
  • samjustin1
  • 2016-07-17 15:43:42
  • 780

剑指Offer面试题37(Java版):两个链表的第一个公共结点

题目:输入两个链表,找出它们的第一个公共结点。 面试的时候碰到这道题,很多应聘者的第一反应就是蛮力法:在第一链表上顺序遍历每个结点,没遍历到一个结点的时候,在第二个链表上顺序遍历每个结点。如果在第二个...
  • jsqfengbao
  • jsqfengbao
  • 2015-08-09 21:40:44
  • 1403

Java找出两个链表的第一个公共节点

输入两个链表,找出它们的第一个公共结点。
  • u014282557
  • u014282557
  • 2017-06-06 17:07:58
  • 743

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

【 声明:版权所有,转载请标明出处,请勿用于商业用途。  联系信箱:libin493073668@sina.com】 题目链接:http://www.nowcoder.com/p...
  • libin1105
  • libin1105
  • 2015-09-12 11:02:19
  • 669

[LeetCode] 判断两个链表是否有公共节点并返回第一个公共节点

Write a program to find the node at which the intersection of two singly linked lists begins. For e...
  • zhang1990214
  • zhang1990214
  • 2015-04-27 15:02:01
  • 852

两个单向链表,找出它们的第一个公共结点。

题目:两个单向链表,找出它们的第一个公共结点。 链表的结点定义为: struct ListNode {       int       m_nKey;       Lis...
  • u013322907
  • u013322907
  • 2014-08-01 17:02:43
  • 1016
收藏助手
不良信息举报
您举报文章:求两个链表的第一个公共结点
举报原因:
原因补充:

(最多只允许输入30个字)