題目:輸入兩個鏈表,找出它們的第一個公共結點,鏈表結點的定義以下:ios
1 struct ListNode 2 { 3 int m_nKey; 4 ListNode* m_pNext; 5 }
一共三種方法解答此題目:spa
方法1:雙層遍歷鏈表,複雜度爲O(m*n)code
方法2:有兩個棧存儲鏈表結點模擬從後往前遍歷blog
方法3:先計算出兩個鏈表長度,而後使得較長的鏈表先走k步與短鏈表對齊再一塊兒向後比較io
這裏咱們只介紹方法三class
咱們以鏈表:stream
1->2->3->6->7List
4->5->6->7爲例遍歷
1.先計算出鏈表1長度爲5鏈表2長度爲4方法
2.鏈表1比鏈表2長一個結點那麼讓鏈表1先走一步到結點2
3.兩個鏈表同時向後遍歷並比較遇到相同的結點返回並結束
簡單實現以下:
1 #include <iostream> 2 using namespace std; 3 4 struct ListNode 5 { 6 int m_nKey; 7 ListNode* m_pNext; 8 }; 9 10 void PrintListNode(ListNode* Head) 11 { 12 ListNode* Temp=Head; 13 while(Temp!=NULL) 14 { 15 cout<<Temp->m_nKey<<","; 16 Temp=Temp->m_pNext; 17 } 18 cout<<endl; 19 } 20 21 22 ListNode* FindTheFirstSameNode(ListNode*Head1,ListNode* Head2) 23 { 24 if(Head1==NULL||Head2==NULL) 25 return NULL; 26 27 ListNode* TempHead1=Head1; 28 ListNode* TempHead2=Head2; 29 30 int len1=0; 31 int len2=0; 32 33 while(TempHead1!=NULL) 34 { 35 len1++; 36 TempHead1=TempHead1->m_pNext; 37 } 38 while(TempHead2!=NULL) 39 { 40 len2++; 41 TempHead2=TempHead2->m_pNext; 42 } 43 44 int k=0; 45 TempHead1=Head1; 46 TempHead2=Head2; 47 if(len1>len2) 48 { 49 k=len1-len2; 50 TempHead1=Head1; 51 int count=0; 52 while(count<k) 53 { 54 TempHead1=TempHead1->m_pNext; 55 count++; 56 } 57 } 58 if(len2>len1) 59 { 60 k=len2-len1; 61 TempHead2=Head2; 62 int count=0; 63 while(count<k) 64 { 65 TempHead2=TempHead2->m_pNext; 66 count++; 67 } 68 } 69 70 71 while(TempHead1!=NULL&&TempHead2!=NULL) 72 { 73 if(TempHead1->m_nKey==TempHead2->m_nKey) 74 return TempHead1; 75 76 TempHead1=TempHead1->m_pNext; 77 TempHead2=TempHead2->m_pNext; 78 } 79 80 return NULL; 81 } 82 83 84 int main() 85 { 86 ListNode *Head1; 87 Head1=new ListNode(); 88 Head1->m_nKey=1; 89 Head1->m_pNext=NULL; 90 91 ListNode *Node1=new ListNode(); 92 ListNode *Node2=new ListNode(); 93 ListNode *Node3=new ListNode(); 94 ListNode *Node4=new ListNode(); 95 96 Node1->m_nKey=2; 97 Node1->m_pNext=NULL; 98 99 100 Node2->m_nKey=3; 101 Node2->m_pNext=NULL; 102 103 Node3->m_nKey=6; 104 Node3->m_pNext=NULL; 105 106 Node4->m_nKey=7; 107 Node4->m_pNext=NULL; 108 109 Head1->m_pNext=Node1; 110 Node1->m_pNext=Node2; 111 Node2->m_pNext=Node3; 112 Node3->m_pNext=Node4; 113 114 ListNode *Head2=new ListNode(); 115 Head2->m_nKey=4; 116 Head2->m_pNext=NULL; 117 118 ListNode *Node5=new ListNode(); 119 Node5->m_nKey=5; 120 Node5->m_pNext=NULL; 121 122 Head2->m_pNext=Node5; 123 124 125 Node5->m_pNext=Node3; 126 cout<<"PrintListNode One: "; 127 PrintListNode(Head1); 128 129 cout<<"PrintListNode Two: "; 130 PrintListNode(Head2); 131 132 ListNode* FirstNode; 133 FirstNode=FindTheFirstSameNode(Head1,Head2); 134 135 cout<<"The First SameNode is: "<<FirstNode->m_nKey<<endl; 136 return 0; 137 }
運行截圖:
代碼中結點的釋放讀者自行釋放便可。