91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

C++怎么求兩個鏈表的交點

發布時間:2021-07-30 18:11:05 來源:億速云 閱讀:152 作者:chen 欄目:開發技術

這篇文章主要介紹“C++怎么求兩個鏈表的交點”,在日常操作中,相信很多人在C++怎么求兩個鏈表的交點問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”C++怎么求兩個鏈表的交點”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

求兩個鏈表的交點

這道求兩個鏈表的交點題要求執行時間為 O(n),則不能利用類似冒泡法原理去暴力查找相同點,事實證明如果鏈表很長的話,那樣的方法效率很低。我也想到會不會是像之前刪除重復元素的題一樣需要用兩個指針來遍歷,可是想了好久也沒想出來怎么弄。無奈上網搜大神們的解法,發覺其實解法很簡單,因為如果兩個鏈長度相同的話,那么對應的一個個比下去就能找到,所以只需要把長鏈表變短即可。具體算法為:分別遍歷兩個鏈表,得到分別對應的長度。然后求長度的差值,把較長的那個鏈表向后移動這個差值的個數,然后一一比較即可。代碼如下: 

C++ 解法一:

class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        if (!headA || !headB) return NULL;
        int lenA = getLength(headA), lenB = getLength(headB);
        if (lenA < lenB) {
            for (int i = 0; i < lenB - lenA; ++i) headB = headB->next;
        } else {
            for (int i = 0; i < lenA - lenB; ++i) headA = headA->next;
        }
        while (headA && headB && headA != headB) {
            headA = headA->next;
            headB = headB->next;
        }
        return (headA && headB) ? headA : NULL;
    }
    int getLength(ListNode* head) {
        int cnt = 0;
        while (head) {
            ++cnt;
            head = head->next;
        }
        return cnt;
    }
};

Java 解法一:

public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        if (headA == null || headB == null) return null;
        int lenA = getLength(headA), lenB = getLength(headB);
        if (lenA > lenB) {
            for (int i = 0; i < lenA - lenB; ++i) headA = headA.next;
        } else {
            for (int i = 0; i < lenB - lenA; ++i) headB = headB.next;
        }
        while (headA != null && headB != null && headA != headB) {
            headA = headA.next;
            headB = headB.next;
        }
        return (headA != null && headB != null) ? headA : null;
    }
    public int getLength(ListNode head) {
        int cnt = 0;
        while (head != null) {
            ++cnt;
            head = head.next;
        }
        return cnt;
    }
}

這道題還有一種特別巧妙的方法,雖然題目中強調了鏈表中不存在環,但是我們可以用環的思想來做,我們讓兩條鏈表分別從各自的開頭開始往后遍歷,當其中一條遍歷到末尾時,我們跳到另一個條鏈表的開頭繼續遍歷。兩個指針最終會相等,而且只有兩種情況,一種情況是在交點處相遇,另一種情況是在各自的末尾的空節點處相等。為什么一定會相等呢,因為兩個指針走過的路程相同,是兩個鏈表的長度之和,所以一定會相等。這個思路真的很巧妙,而且更重要的是代碼寫起來特別的簡潔,參見代碼如下:

C++ 解法二:

class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        if (!headA || !headB) return NULL;
        ListNode *a = headA, *b = headB;
        while (a != b) {
            a = a ? a->next : headB;
            b = b ? b->next : headA;
        }
        return a;
    }
};

Java 解法二:

public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        if (headA == null || headB == null) return null;
        ListNode a = headA, b = headB;
        while (a != b) {
            a = (a != null) ? a.next : headB;
            b = (b != null) ? b.next : headA;
        }
        return a;
    }
}

到此,關于“C++怎么求兩個鏈表的交點”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

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

c++
AI

汕尾市| 集贤县| 宽城| 康定县| 阿拉善左旗| 阳城县| 寿宁县| 出国| 瑞金市| 云和县| 大荔县| 奉新县| 自贡市| 于田县| 巴林右旗| 武宣县| 平塘县| 略阳县| 垣曲县| 绍兴市| 维西| 丹东市| 阿克苏市| 泽普县| 永兴县| 常宁市| 云霄县| 灵璧县| 疏附县| 来宾市| 额尔古纳市| 吴江市| 湟中县| 理塘县| 扎鲁特旗| 山西省| 乃东县| 渑池县| 白水县| 蚌埠市| 来凤县|