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

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


思路
两个链表有交叉的部分,则交叉部分为公共节点,由于链表的每个节点只有唯一的一个next,所以,链表交叉后,之后的节点全部是公共节点,不会再有分叉了。
思路一:
将两个链表合并,形成pHead1+pHead2和pHead2+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
        if pHead1 == None or pHead2 == None:
            return None
        else:
            node1, node2 = pHead1, pHead2
            while(node1 != node2):
                # 相当于遍历pHead1+pHead2
                if(node1 != None):
                    node1 = node1.next
                else:
                    node1 = pHead2
                # 相当于遍历pHead2+pHead1
                if(node2 != None):
                    node2 = node2.next
                else:
                    node2 = pHead1
            return node1 # 返回node2也可以

思路二:

# -*- 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
        # 获取链表长度
        def getLenth(pHead):
            if pHead == None:
                return 0
            lenth = 0
            while(pHead.next != None):
                pHead = pHead.next
                lenth += 1
            return lenth

        if pHead1 == None or pHead2 == None:
            return None
        else:
            node1, node2 = pHead1, pHead2
            len1 = getLenth(node1)
            len2 = getLenth(node2)
            longer,shoter,lenDif = None,None,0
            if len1>len2:
                longer,shoter,lenDif = node1,node2,len1-len2
            else:
                longer,shoter,lenDif = node2,node1,len2-len1
            # 长的链表长出来的部分删(遍历)掉
            for i in range(lenDif):
                longer = longer.next
            # 两个等长的链表一起遍历
            while(longer != shoter):
                longer = longer.next
                shoter = shoter.next
            return longer # 返回shoter也可以