亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

劍指offer:兩個鏈表的第一個公共結點

發布時間:2020-07-20 23:13:33 來源:網絡 閱讀:476 作者:Jayce_SYSU 欄目:編程語言

題目描述
輸入兩個鏈表,找出它們的第一個公共結點。

# -*- coding: utf-8 -*-
# @Time         : 2019-07-12 22:20
# @Author       : Jayce Wong
# @ProjectName  : job
# @FileName     : findFirstCommonNode.py
# @Blog         : https://blog.51cto.com/jayce1111
# @Github       : https://github.com/SysuJayce

class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None

class Solution:
    """
    兩個單向鏈表的第一個公共節點,如果存在這樣的公共節點,那么這兩個鏈表從該節點開始剩余的節點都是
    一樣的。

    解法1:
    對于第一個鏈表,遍歷其所有節點,在掃描到第x個節點的時候,從第二個鏈表中遍歷所有節點,如果存在
    一個和節點x一樣的節點,那么節點x就是第一個公共節點。
    這種解法的時間復雜度為O(n^2)

    解法2:
    前面說到如果兩個單向鏈表存在公共節點,那么從第一個公共節點開始到最后一個節點都是公共節點。
    因此,如果我們能從兩個鏈表的末尾節點開始遍歷,找到最后一個相同的節點,那么這個節點就是第一個
    公共節點。但是這個單向鏈表不支持反向遍歷,因此我們可以利用棧的性質,維護兩個輔助棧,分別保存
    兩個鏈表的節點,然后每次比較這兩個輔助棧的棧頂元素。最后我們就能在O(n)的時間復雜度內解決問題。

    解法3:
    雖然解法2的時間復雜度已經很優了,但是仍需要用到輔助空間,其實借助快慢指針的思想,我們可以避免
    這樣的額外空間開銷。先計算兩個鏈表的長度,然后先移動長鏈表的指針,使得長短鏈表的指針距離各自的
    末尾有相同的距離,然后開始同時移動兩個指針,直到出現兩指針指向的節點相同為止,那么這個相同節點
    就是第一個公共節點。
    """
    def FindFirstCommonNode(self, pHead1, pHead2):
        # 記錄兩個鏈表的長度
        len1 = len2 = 0
        pNode1 = pHead1
        pNode2 = pHead2
        while pNode1:
            pNode1 = pNode1.next
            len1 += 1
        while pNode2:
            pNode2 = pNode2.next
            len2 += 1

        # 確定哪個鏈表是長鏈表,哪個鏈表是短鏈表
        if len1 > len2:
            pLong = pHead1
            pShort = pHead2
        else:
            pLong = pHead2
            pShort = pHead1

        # 調整長鏈表的指針,使得長短鏈表距離各自末尾節點距離相同
        diff = abs(len1 - len2)
        for i in range(diff):
            pLong = pLong.next

        # 同時移動長短鏈表指針,當出現第一個相同節點(即第一個公共節點)的時候,返回這個節點
        while pLong:
            if pLong == pShort:
                return pLong
            pLong = pLong.next
            pShort = pShort.next

        # 如果不存在公共節點,返回空指針
        return None
向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

若尔盖县| 罗田县| 乌拉特后旗| 微博| 铜陵市| 涡阳县| 绥芬河市| 墨脱县| 越西县| 虹口区| 海安县| 伽师县| 惠水县| 屏东市| 胶州市| 犍为县| 银川市| 静海县| 罗源县| 齐河县| 岳阳县| 邯郸市| 天津市| 本溪市| 德化县| 鸡泽县| 平安县| 昌都县| 内乡县| 砀山县| 迁西县| 德令哈市| 普定县| 自贡市| 阳信县| 崇州市| 诏安县| 同德县| 乐安县| 永仁县| 鄂尔多斯市|