題目描述:
輸入兩個鍊錶,找出它們的第乙個公共結點。
題目分析:
只是資料域相同不是公共節點。公共結點代表該節點在兩個鍊錶中的資料域和指標域都是相同的,這意味著從該公共節點開始,後面的結點都是兩個鍊錶共有的,如圖:
解題思路:
思路1:
從正序比較的角度來考慮:觀察上圖,鍊錶1長度大於鍊錶2,那麼公共結點絕不可能存在於鍊錶1比鍊錶2多出來的那些結點中。基於這種想法,我們可以先求出兩個鍊錶的長度,然後現在長鍊表上遍歷一段距離後,再開始同時遍歷長鍊表和短鍊錶並進行比較。
思路2:
從倒序比較的角度考慮:這個思路比較容易理解,因為兩個鍊錶的後面一部分是重複的,我們可以建立兩個棧,將兩個鍊錶分別壓入兩個棧:
此時如果有棧是空的,說明無公共節點,返回null;
否則,迴圈取兩個棧的棧頂元素進行比較:如果不相等,說明公共結點為該節點的下乙個結點,否則迴圈直至有乙個棧或兩個棧為空終止:終止的原因有以下幾條(1)如果兩個棧都為空,說明是同乙個鍊錶,返回任意鍊錶的頭結點作為公共節點。例如 (2)如果其中乙個鍊錶為空,說明短鍊表的全部元素都是和長鍊錶共有的,則返回短鍊表的頭結點。例如
測試:兩者效能差不多,執行時間和占用空間相差無幾。
**實現:
思路1
1思路2獲取鍊錶長度:public
static
listnode findfirstcommonnode(listnode phead1, listnode phead2)
9 walknode=phead2;
10while(walknode!=null)14
//當兩個鍊錶都為空煉表時,無公共結點,返回null
15if(stack1.size()==0||stack2.size()==0)
18while(!stack1.empty()&&!stack2.empty()) 24}
25//
當兩個棧同時為空時,且沒有出現非公共結點,說明兩個鍊錶是完全一樣的
26if(stack1.size()==0&&stack2.size()==0)
29//
當stack1先空時,說明鍊錶1的所有結點和鍊錶2都是公共的
30else
if(stack1.size()==0)
33//
當stack2先空時,說明鍊錶2的所有結點和鍊錶1都是公共的
34else
37 }
1尋找公共結點:public
static
intgetlength(listnode phead)
8return
length;
9 }
1主函式測試:public
static
listnode findfirstcommonnode(listnode phead1, listnode phead2) 13}
14else19}
20//
遍歷比較
21while(walknode1!=null
)25 walknode1=walknode1.next;
26 walknode2=walknode2.next;27}
28return
null
;
29 }
publicview codestatic
void
main(stringargs)
牛客網 兩個鍊錶的第乙個公共結點
輸入兩個鍊錶,找出它們的第乙個公共結點。我們先把問題簡化 如何判斷兩個單向鍊錶有沒有公共結點?前面已經提到,如果兩個鍊錶有乙個公共結點,那麼該公共結點之後的所有結點都是重合的。那麼,它們的最後乙個結點必然是重合的。因此,我們判斷兩個鍊錶是不是有重合的部分,只要分別遍歷兩個鍊錶到最後乙個結點。如果兩個...
兩個鍊錶的第乙個公共結點
思路 獲取兩個鍊錶的長度,求的長度差n,讓長鍊表先遍歷n次,然後長鍊表和短鍊錶同時遍歷,當長鍊錶和短鍊錶相等時,即為第一公共結點。o m1 m2 public class findfirstcomnode int len1 getnodelength root1 int len2 getnodele...
兩個鍊錶的第乙個公共結點
題目 輸入兩個鍊錶,找出他們的第乙個公共結點。方法1 分別把兩個鍊錶的節點放入兩個棧裡,這樣兩個鍊錶的尾結點就位於兩個棧的棧頂,接下來比較兩個棧頂的結點是否相同。如果相同,則把棧頂彈出接著比較下乙個棧頂,直到找到最後乙個相同的結點。時間和空間複雜度都是o m n 方法2 先遍歷兩個鍊錶得到它們的長度...