兩個鍊錶的第乙個公共結點 牛客offer

2022-05-07 02:00:08 字數 1954 閱讀 6664

題目描述:

輸入兩個鍊錶,找出它們的第乙個公共結點。

題目分析:

只是資料域相同不是公共節點。公共結點代表該節點在兩個鍊錶中的資料域和指標域都是相同的,這意味著從該公共節點開始,後面的結點都是兩個鍊錶共有的,如圖:

解題思路:

思路1:

從正序比較的角度來考慮:觀察上圖,鍊錶1長度大於鍊錶2,那麼公共結點絕不可能存在於鍊錶1比鍊錶2多出來的那些結點中。基於這種想法,我們可以先求出兩個鍊錶的長度,然後現在長鍊表上遍歷一段距離後,再開始同時遍歷長鍊表和短鍊錶並進行比較。

思路2:

從倒序比較的角度考慮:這個思路比較容易理解,因為兩個鍊錶的後面一部分是重複的,我們可以建立兩個棧,將兩個鍊錶分別壓入兩個棧:

此時如果有棧是空的,說明無公共節點,返回null;

否則,迴圈取兩個棧的棧頂元素進行比較:如果不相等,說明公共結點為該節點的下乙個結點,否則迴圈直至有乙個棧或兩個棧為空終止:終止的原因有以下幾條(1)如果兩個棧都為空,說明是同乙個鍊錶,返回任意鍊錶的頭結點作為公共節點。例如 (2)如果其中乙個鍊錶為空,說明短鍊表的全部元素都是和長鍊錶共有的,則返回短鍊表的頭結點。例如

測試:兩者效能差不多,執行時間和占用空間相差無幾。

**實現:

思路1

1

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 }

思路2獲取鍊錶長度:

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 }

主函式測試:

public

static

void

main(stringargs)

view code

牛客網 兩個鍊錶的第乙個公共結點

輸入兩個鍊錶,找出它們的第乙個公共結點。我們先把問題簡化 如何判斷兩個單向鍊錶有沒有公共結點?前面已經提到,如果兩個鍊錶有乙個公共結點,那麼該公共結點之後的所有結點都是重合的。那麼,它們的最後乙個結點必然是重合的。因此,我們判斷兩個鍊錶是不是有重合的部分,只要分別遍歷兩個鍊錶到最後乙個結點。如果兩個...

兩個鍊錶的第乙個公共結點

思路 獲取兩個鍊錶的長度,求的長度差n,讓長鍊表先遍歷n次,然後長鍊表和短鍊錶同時遍歷,當長鍊錶和短鍊錶相等時,即為第一公共結點。o m1 m2 public class findfirstcomnode int len1 getnodelength root1 int len2 getnodele...

兩個鍊錶的第乙個公共結點

題目 輸入兩個鍊錶,找出他們的第乙個公共結點。方法1 分別把兩個鍊錶的節點放入兩個棧裡,這樣兩個鍊錶的尾結點就位於兩個棧的棧頂,接下來比較兩個棧頂的結點是否相同。如果相同,則把棧頂彈出接著比較下乙個棧頂,直到找到最後乙個相同的結點。時間和空間複雜度都是o m n 方法2 先遍歷兩個鍊錶得到它們的長度...