兩個連結串列的第一個公共節點
一、需求
- 輸入兩個連結串列,找出它們的第一個公共節點。
- 如下面的兩個連結串列:
- 在節點 c1 開始相交。
二、雙指標(暴力)
2.1 思路分析
- 採用雙重迴圈,使用兩個指標p、q分別指向連結串列A和連結串列B,外迴圈遍歷連結串列A,內迴圈遍歷連結串列B,每次判斷當前連結串列A的節點是否就是當前連結串列B的節點,如果是就返回該節點,否則就一直遍歷,直到連結串列A遍歷結束;
- 如果不存在公共結點,則返回null;
- 因為本題要求時間複雜度限制在O(1),故該方法在執行時會出現超時;
2.2 程式碼實現
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
ListNode p = headA;
while(p != null) {
ListNode q = headB;
while(q != null) {
if(p == q) return p;
q = q.next;
}
p = p.next;
}
return null;
}
}
2.3 複雜度分析
- 時間複雜度為O(n^2),因為採用了雙重迴圈,計算次數為n^2;
- 空間複雜度為O(1),變數p,q佔用常數大小的額外空間;
三、雙指標法(優化)
3.1 思路分析
- 假設連結串列A、B存在公共節點,連結串列A頭節點距離公共節點為L1步,即[A頭節點,公共節點),連結串列B頭節點距離公共節點為L2步,即[B頭節點,公共節點),兩個連結串列的公共部分長度為C;
- 那麼根據L1+C+L2 = L2+C+L1的原理,設指標p,q指向連結串列A,B,p,q同時移動,當p走過L1+C+L2後,q走過L2+C+L1後,它們會在公共結點相遇;
3.2 程式碼實現
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
ListNode p = headA;
ListNode q = headB;
while(p != q) {
//這裡讓雙指標同時移動,避免了迴圈
p = p != null ? p.next : headB;
q = q != null ? q.next : headA;
}
return p;
}
}
3.3 複雜度分析
- 時間複雜度為O(n);
- 空間複雜度為O(1);
四、學習地址
作者:腐爛的橘子
相關文章
- 兩個連結串列的第一個公共結點
- 劍指Offer-38-兩個連結串列的第一個公共節點
- JZ-036-兩個連結串列的第一個公共結點
- 力扣 - 劍指 Offer 52. 兩個連結串列的第一個公共節點力扣
- 劍指offer——兩個連結串列的第一個公共結點C++C++
- 【LeetCode】【連結串列】劍指 Offer 52. 兩個連結串列的第一個公共節點 思路解析和程式碼LeetCode
- 2024/11/27 【連結串列】LeetCode 24 兩兩交換連結串列中的節點 & LeetCode 19 刪除連結串列的倒數第N個節點LeetCode
- 牛客網高頻演算法題系列-BM10-兩個連結串列的第一個公共結點演算法
- K個節點翻轉連結串列
- 【LeetCode連結串列#9】圖解:兩兩交換連結串列節點LeetCode圖解
- **24. 兩兩交換連結串列中的節點****19.刪除連結串列的倒數第N個節點****面試題 02.07. 連結串列相交****142.環形連結串列II**面試題
- [連結串列]leetcode1019-連結串列中的下一個更大節點LeetCode
- Day4(連結串列)|24. 兩兩交換連結串列中的節點 & 19.刪除連結串列的倒數第N個節點 & 面試題 02.07. 連結串列相交 &142.環形連結串列II面試題
- Day 4 | 24. 兩兩交換連結串列中的節點 、 19.刪除連結串列的倒數第N個節點 、面試題 02.07. 連結串列相交 、142.環形連結串列II面試題
- 第四天:● 24. 兩兩交換連結串列中的節點 ● 19.刪除連結串列的倒數第N個節點 ● 面試題 02.07. 連結串列相交 ● 142.環形連結串列II面試題
- leetcode 24 兩兩交換連結串列中的節點LeetCode
- 定義一個函式,輸入一個連結串列的頭節點,反轉該連結串列並輸出反轉後連結串列的頭節點函式
- 【連結串列問題】打卡2:刪除單連結串列的第 K個節點
- 1019. 連結串列中的下一個更大節點
- 程式碼隨想錄day4 | 24 兩兩交換連結串列節點 19 刪除倒數第n個節點 142 環形連結串列
- leetcode 24.兩兩交換連結串列中的節點LeetCode
- LeetCode 24. 兩兩交換連結串列中的節點LeetCode
- 24. 兩兩交換連結串列中的節點 (中等)
- 兩個有序連結串列序列的交集
- 166. 連結串列倒數第n個節點
- 程式碼隨想錄第4天 | 24. 兩兩交換連結串列中的節點、19.刪除連結串列的倒數第N個節點、面試題 02.07. 連結串列相交、142.環形連結串列II面試題
- 合併兩個有序連結串列
- 【劍指offer】【3】輸入一個連結串列,從尾到頭列印連結串列每個節點的值。
- 連結串列中的節點每k個一組翻轉
- 0011 刪除連結串列的倒數第N個節點
- 程式碼隨想錄演算法訓練營第四天 | 連結串列 24.兩兩交換連結串列中的節點 19.刪除連結串列的倒數第N個節點 142.環形連結串列II演算法
- 程式碼隨想錄演算法訓練營day04|24.兩兩交換連結串列中的節點,19.刪除連結串列的倒數第N個節點,面試題 02.07.連結串列相交,142.環形連結串列II演算法面試題
- JZ-076-樹中兩個節點的最低公共祖先
- leetcode:21. 合併兩個有序連結串列(連結串列,簡單)LeetCode
- 特定深度節點連結串列
- 10.13 每日一題 24. 兩兩交換連結串列中的節點每日一題
- LeetCode- 19 刪除連結串列的倒數第N個節點LeetCode
- 題19. 刪除連結串列的倒數第N個節點