劍指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;
}
};
相關文章
- 【LeetCode】【連結串列】劍指 Offer 52. 兩個連結串列的第一個公共節點 思路解析和程式碼LeetCode
- 劍指offer面試17 合併兩個排序的連結串列面試排序
- 劍指offer面試題15 連結串列中倒數第K個結點面試題
- 劍指 Offer 25. 合併兩個排序的連結串列 JavaScript實現排序JavaScript
- PHPer也刷《劍指Offer》之連結串列PHP
- 劍指offer面試16 反轉連結串列面試
- 牛客網高頻演算法題系列-BM10-兩個連結串列的第一個公共結點演算法
- 《劍指offer》:[37]如何得到連結串列環的入口地址
- 劍指OFFER-從頭到尾列印連結串列(Java)Java
- 劍指offer-從尾到頭列印連結串列-phpPHP
- Java連結串列指標確實好煩 - 交換連結串列中連續的兩個節點的位置Java指標
- 《劍指offer》:[58]二叉樹的下一個結點二叉樹
- 連結串列面試題(十三)---求兩個都不帶環的連結串列相交的結點面試題
- 連結串列面試題(七)---合併兩個有序連結串列面試題
- 有a,b兩個已按學號升序排序的連結串列,每個連結串列中的結點包括學號、成績。要求把兩個連結串列合併,仍按學號升序排列。...排序
- 劍指Offer面試題5(Java版):從尾到頭列印連結串列面試題Java
- 【劍指offer】兩個棧實現一個佇列佇列
- 【劍指offer】兩個佇列實現一個棧佇列
- 劍指offer:刪去連結串列中重複的節點。(題解原始碼加圖解)原始碼圖解
- 【劍指offer】樹的子結構
- 利用PHP實現《劍指 offer》之連結串列(資料結構與演算法實戰 )PHP資料結構演算法
- Day4(連結串列)|24. 兩兩交換連結串列中的節點 & 19.刪除連結串列的倒數第N個節點 & 面試題 02.07. 連結串列相交 &142.環形連結串列II面試題
- 劍指Offer 字元流中第一個不重複的字元字元
- 【LeetCode連結串列#9】圖解:兩兩交換連結串列節點LeetCode圖解
- 《劍指offer》:[41]陣列中和為S的兩個數陣列
- **24. 兩兩交換連結串列中的節點****19.刪除連結串列的倒數第N個節點****面試題 02.07. 連結串列相交****142.環形連結串列II**面試題
- 連結串列面試題(十二)---判斷兩個都不帶環的連結串列是否相交面試題
- (python版)《劍指Offer》JZ57:二叉樹的下一個結點Python二叉樹
- leetcode:21. 合併兩個有序連結串列(連結串列,簡單)LeetCode
- K個節點翻轉連結串列
- 連結串列面試題(六)---刪除單連結串列倒數第k個結點面試題
- Day 4 | 24. 兩兩交換連結串列中的節點 、 19.刪除連結串列的倒數第N個節點 、面試題 02.07. 連結串列相交 、142.環形連結串列II面試題
- 《劍指offer》:[55]字元流中第一個不重複的字元字元
- 【劍指offer】第一個只出現一次的字元字元
- 連結串列面試題(五)---尋找連結串列的倒數第k個結點O(N)面試題
- 連結串列面試題(一)---刪除一個無頭單連結串列的非尾結點面試題
- 劍指offer | 09. 用兩個棧實現佇列佇列
- 劍指offer-用兩個棧實現佇列-php佇列PHP