劍指offer——兩個連結串列的第一個公共結點C++
連結串列題一定要想到快慢指標
三種方法:
1.用一個map記錄第一條連結串列每個結點是否出現,遍歷第二條時判斷即可。
2.我稱之為相親相愛法,因為兩條連結串列的長度不確定,所以讓兩個指標分別走1+2兩條連結串列的長度就可以了,這樣走的就是相等了。兩個結點相等時退出迴圈(這樣就算兩個結點都指向空結點也不會死迴圈)。當1為空,就讓1指向連結串列2的頭,2為空,就讓2指向連結串列1的頭。
3.算出兩條連結串列的長度len1和len2,假設len1>len2,就讓連結串列1的指標先走len1-len2步,然後再一起走就行了
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
if(pHead1 == NULL || pHead2 == NULL){
return NULL;
}
//法一來個map記錄出現過的結點,遍歷第二條連結串列時判斷是否出現過
/*O(N),O(N)
map<ListNode*,int> ma;
while(pHead1 != NULL){
ma[pHead1]++;
pHead1 = pHead1->next;
}
while(pHead2 != NULL){
if(ma[pHead2] != 0){
return pHead2;
}
pHead2 = pHead2->next;
}
return NULL;*/
//最好是O(1)的空間複雜度,連結串列就要想到快慢指標
//兩種快慢指標的思路1:相親相愛
/*ListNode* a = pHead1;
ListNode* b = pHead2;
while(a != b){
//如果兩個指標同時到達NULL,就把NULL看做公共節點
//所以不能用a->next==null來判斷,這樣a和b永遠不會變成NULL,如果沒有交點就是死迴圈了
a = a == NULL ? pHead2 : a->next;
b = b == NULL ? pHead1 : b->next;
}
return a;*/
//2:長的先走
int len1 = 0, len2 = 0;
ListNode* a = pHead1;
ListNode* b = pHead2;
while(a != NULL){
len1++;
a = a->next;
}
while(b != NULL){
len2++;
b = b->next;
}
if(len1 > len2){
//第一條比較長,走len1-len2步
while((len1 - len2) != 0){
pHead1 = pHead1->next;
len1--;
}
}
else{
while((len2-len1)!=0){
pHead2 = pHead2->next;
len2--;
}
}
while(pHead1 != pHead2){
pHead1 = pHead1->next;
pHead2 = pHead2->next;
}
return pHead1;
}
};
相關文章
- 劍指Offer-38-兩個連結串列的第一個公共節點
- 力扣 - 劍指 Offer 52. 兩個連結串列的第一個公共節點力扣
- 【LeetCode】【連結串列】劍指 Offer 52. 兩個連結串列的第一個公共節點 思路解析和程式碼LeetCode
- 兩個連結串列的第一個公共結點
- 兩個連結串列的第一個公共節點
- JZ-036-兩個連結串列的第一個公共結點
- 劍指offer——連結串列中倒數第k個結點
- 劍指 Offer 25. 合併兩個排序的連結串列 JavaScript實現排序JavaScript
- 【劍指offer】【3】輸入一個連結串列,從尾到頭列印連結串列每個節點的值。
- 力扣 - 劍指 Offer 22. 連結串列中倒數第k個節點力扣
- PHPer也刷《劍指Offer》之連結串列PHP
- 劍指 Offer 24. 反轉連結串列
- 劍指 Offer 24.反轉連結串列
- 劍指offer-----刪除連結串列中的重複節點
- 牛客網高頻演算法題系列-BM10-兩個連結串列的第一個公共結點演算法
- 劍指 Offer 35. 複雜連結串列的複製
- 劍指OFFER-從頭到尾列印連結串列(Java)Java
- 劍指offer-從尾到頭列印連結串列-phpPHP
- 3. 從尾到頭列印連結串列(劍指offer)
- 兩個有序連結串列序列的交集
- 合併兩個有序連結串列
- 2024/11/27 【連結串列】LeetCode 24 兩兩交換連結串列中的節點 & LeetCode 19 刪除連結串列的倒數第N個節點LeetCode
- 劍指offer:刪去連結串列中重複的節點。(題解原始碼加圖解)原始碼圖解
- 力扣 - 劍指 Offer 06. 從尾到頭列印連結串列.md力扣
- leetcode:21. 合併兩個有序連結串列(連結串列,簡單)LeetCode
- 連結串列倒數第k個結點
- Day4(連結串列)|24. 兩兩交換連結串列中的節點 & 19.刪除連結串列的倒數第N個節點 & 面試題 02.07. 連結串列相交 &142.環形連結串列II面試題
- **24. 兩兩交換連結串列中的節點****19.刪除連結串列的倒數第N個節點****面試題 02.07. 連結串列相交****142.環形連結串列II**面試題
- 【LeetCode連結串列#9】圖解:兩兩交換連結串列節點LeetCode圖解
- [連結串列]leetcode1019-連結串列中的下一個更大節點LeetCode
- Day 4 | 24. 兩兩交換連結串列中的節點 、 19.刪除連結串列的倒數第N個節點 、面試題 02.07. 連結串列相交 、142.環形連結串列II面試題
- (python版)《劍指Offer》JZ57:二叉樹的下一個結點Python二叉樹
- 將兩個升序連結串列合併為一個新的 升序 連結串列並返回。(新手篇06)
- 利用PHP實現《劍指 offer》之連結串列(資料結構與演算法實戰 )PHP資料結構演算法
- K個節點翻轉連結串列
- 第四天:● 24. 兩兩交換連結串列中的節點 ● 19.刪除連結串列的倒數第N個節點 ● 面試題 02.07. 連結串列相交 ● 142.環形連結串列II面試題
- JZ-016-合併兩個排序的連結串列排序
- 【連結串列問題】打卡2:刪除單連結串列的第 K個節點