相交鏈表求節點

相交鏈表求節點是一個常見的鏈表問題,涉及到判斷兩個鏈表是否相交以及找到相交部分的節點。本文將從鏈表的常見問題、判定相交鏈表、求解相交節點三個方面進行詳細闡述。

一、鏈表的常見問題

鏈表是一種常見的數據結構,其主要特點是通過指針相連的節點的集合。在鏈表的操作中,常見的操作包括:插入節點、刪除節點、查找節點等。其中,判斷鏈表是否相交是一個重要的問題。

二、判定相交鏈表

判斷兩個鏈表是否相交的常見方法是先遍歷兩個鏈表,分別得到它們的長度l1和l2,然後讓較長的鏈表先走|l1-l2|步,使得兩個鏈表起點對齊,最後同時遍歷兩個鏈表,找到第一個相同的節點即為相交節點。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        int lenA = 0, lenB = 0;
        ListNode *p1 = headA, *p2 = headB;
        while (p1 != NULL) {
            lenA++;
            p1 = p1->next;
        }
        while (p2 != NULL) {
            lenB++;
            p2 = p2->next;
        }
        p1 = headA;
        p2 = headB;
        int diff = abs(lenA - lenB);
        if (lenA > lenB) {
            for (int i = 0; i < diff; i++) {
                p1 = p1->next;
            }
        } else {
            for (int i = 0; i < diff; i++) {
                p2 = p2->next;
            }
        }
        while (p1 != NULL && p2 != NULL) {
            if (p1 == p2) {
                return p1;
            }
            p1 = p1->next;
            p2 = p2->next;
        }
        return NULL;
    }
};

三、求解相交節點

找到相交節點後,可以使用雙指針法遍歷兩個鏈表,直到找到相同節點即為相交節點。

class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        int lenA = 0, lenB = 0;
        ListNode *p1 = headA, *p2 = headB;
        while (p1 != NULL) {
            lenA++;
            p1 = p1->next;
        }
        while (p2 != NULL) {
            lenB++;
            p2 = p2->next;
        }
        p1 = headA;
        p2 = headB;
        int diff = abs(lenA - lenB);
        if (lenA > lenB) {
            for (int i = 0; i < diff; i++) {
                p1 = p1->next;
            }
        } else {
            for (int i = 0; i < diff; i++) {
                p2 = p2->next;
            }
        }
        while (p1 != NULL && p2 != NULL) {
            if (p1 == p2) {
                return p1;
            }
            p1 = p1->next;
            p2 = p2->next;
        }
        return NULL;
    }
};

四、總結

本文從鏈表的常見問題、判定相交鏈表、求解相交節點三個方面對相交鏈表求節點問題進行了詳細闡述。希望能對讀者有所幫助。

原創文章,作者:WPSTD,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/373866.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
WPSTD的頭像WPSTD
上一篇 2025-04-27 15:26
下一篇 2025-04-27 15:26

相關推薦

  • 利用Python實現兩個鏈表合併為一個有序鏈表

    對於開發工程師來說,實現兩個鏈表合併為一個有序鏈表是必須掌握的技能之一。Python語言在鏈表處理上非常便利,本文將從多個方面詳細闡述如何利用Python實現兩個鏈表合併為一個有序…

    編程 2025-04-29
  • Python獲取單鏈表長度的方法

    本文將從以下幾個方面詳細闡述Python中獲取單鏈表長度的方法,並為每個方面提供詳細的代碼示例。 一、定義鏈表 在Python中,我們可以使用類來定義鏈表。具體實現如下: clas…

    編程 2025-04-27
  • k8s節點設置cpu高於多少就不調度

    本文將從以下幾個方面詳細闡述k8s節點設置cpu高於多少就不調度的相關內容: 一、k8s節點設置的概念和原理 k8s是Google開源的容器集群管理系統,用於自動化部署、擴展和管理…

    編程 2025-04-27
  • TIPC:多節點通信的高效解決方案

    一、TIPC概述 TIPC是一個Linux內核中的通信協議,在多節點通信場景下擁有出色的表現,被許多公司使用。 TIPC協議支持傳輸層的連接管理、擁塞控制、流量調整等高級特性,對於…

    編程 2025-04-24
  • jQuery創建節點的使用技巧

    一、高效創建節點的基礎知識 jQuery是建立在JavaScript之上的一個強大而靈活的庫,它通過一些簡單的API,簡化了JavaScript DOM操作的繁瑣和複雜度。通過使用…

    編程 2025-04-22
  • 深入了解環形鏈表

    一、基礎知識 環形鏈表是一種特殊的鏈表,和普通鏈表不同的地方在於,最後一個節點的下一個節點指針不是指向NULL,而是指向鏈表的第一個節點。這樣就形成了一個環,因此也稱為循環鏈表。在…

    編程 2025-04-20
  • C++ 鏈表的全面解析

    一、什麼是鏈表 鏈表是一種線性數據結構,與數組不同的是,鏈表元素不存儲在連續的內存空間中,而是通過指針鏈接在一起。鏈表的每個節點由兩個部分組成,一個是存儲數據的部分,另一個是指向下…

    編程 2025-04-12
  • JavaScript如何獲取子節點

    一、獲取指定元素的所有子節點 在JavaScript中,可以使用childNodes屬性獲取指定元素的所有子節點,包括元素、文本節點、注釋節點等。 var element = do…

    編程 2025-03-12
  • 重排鏈表詳解

    一、鏈表與重排鏈表簡介 鏈表是一種常見的數據結構,由一系列節點組成,每個節點包含一個指針指向下一個節點。鏈表有單向鏈表、雙向鏈表、循環鏈表等多種類型,用於實現隊列、棧、圖等數據結構…

    編程 2025-02-24
  • Js 鏈表詳解

    一、什麼是鏈表 鏈表是一種經典的數據結構,常用於實現棧、隊列、哈希表、LRU算法等。它由一系列結點組成,每個結點都包含指向下一個結點的指針,最後一個結點的指針指向空。相較於數組,鏈…

    編程 2025-02-01

發表回復

登錄後才能評論