題目:
給定兩個非環單鏈表(first, second),檢測兩個鍊錶是否有交點,如果有返回第乙個交點。
思路:如果first==second,那麼顯然相交,直接返回first。
否則,分別從first,second開始遍歷兩個鍊錶獲得其長度len1與len2。假設len1>len2,那麼指標p1由first開始向後移動len1-len2步。
指標p2=second,下面p1、p2每次向後前進一步並比較是否相等,如果相等即返回該結點,否則說明兩個鍊錶沒有交點。
**:
node *isintersect(node *first, node *second)
node *p1, *p2;
p1 = first;
p2 = second;
int len1 = length_linklist(first);
int len2 = length_linklist(second);
if(len1 >= len2)
}else
}while(p1 != null && p2 != null)
p1 = p1->next;
p2 = p2->next;
}return null;
}
注:**中所用到的計算單鏈表長度的length_linklist()函式請看
「單鏈表基礎」
擴充套件:考慮假設鍊錶有環,應該怎麼檢測是否有交點?
兩個面試題
1.實現乙個lite版的字串替換函式 c c char strreplace char str,const char sub,const char rep 限制條件和要求如下 1.其中str為原字串,sub為待被替換的子串。為簡單起見,假定字串sub和rep長度一樣 2.直接對原字串str進行修改並...
開心IT面試題 兩個有序鍊錶的合併
題目 有兩個有序鍊錶,各自內部是有序的,但是兩個鍊錶之間是無序的 思路 假設兩個有序鍊錶分別為first和second。建立兩個單鏈表p1,p2。分別從煉表頭開始遍歷,比較p1 data和p2 data,若p1 data p2 data,取p2,p1 p1 next 否則取p1,p2 p2 next...
面試題目 合併兩個有序單鏈表
乙個面試題目,將兩個遞增的有序單鏈表合併成乙個遞增單鏈表。有兩種理解 1 new乙個單鏈表,返回新的頭節點 2 在原煉表上操作,返回新的頭節點 第一種實現較為簡單,只需要從頭比較鍊錶的節點,將較小的插入新鍊錶,被插入的節點指標後移,直至遍歷整個鍊錶。而在原表操作就相對複雜一點,主要有三部分 首先確定...