2017-07-24 62 views
0

我正在研究這個在hackerrank上查找合併節點的方法。我的方法是:當兩個節點都不爲空時,我想將其中一個列表移動到它們的下一個節點,這是flag變量的用途。但不知何故,它給我分段錯誤?我是否意外地訪問了一個空變量?有人請賜教。以下是我的方法代碼。查找合併節點時發生分段錯誤?

約束:這兩個列表將收斂和兩個列表都是非NULL

int FindMergeNode(Node *headA, Node *headB) 
{ 
    // Complete this function 
    // Do not write the main method. 
    bool flag = true; 
    while(headA != headB){ 
     if(flag) headA=headA->next; 
     else headB=headB->next; 
     flag = !flag; 
    } 

    return headA->data; //or headB->data; 
} 
+1

爲什麼不看你的調試器? –

+0

你永遠不會檢查'headA'或'headB'是否爲'NULL'。試圖從'(NULL) - > next'讀取將會調用未定義的行爲。 – Havenard

+0

我之前檢查過,並試圖縮短我的代碼,並把它放在while循環中。謝謝,我會在我的代碼中修復它。 –

回答

3

你做了兩個假設:
1.存在這樣的節點。
2.該節點距每個列表開頭的距離在兩個列表之間相差至多1。您在一個列表中交替前進,然後檢查是否到達同一個節點(按地址)。所以如果list1在你正在查找的節點之前沒有節點,並且list2在它之前有2個節點,那麼你將找不到匹配。

如果我正確理解你的問題,事實是距離列表末尾的距離是相同的(因爲它們的尾部是相同的)。

+0

是的,約束表明兩個節點都不是NULL,它們也會收斂。 Thx指出,我會把它放在問題上。兩個肯定是我失敗的原因。謝謝! –

1

爲什麼使用標誌直接使用條件來檢查它是否是最後一個節點

if(headA->next ==NULL) 
headA=headA->next; 
else if (headB->next== NULL) 
headB=headB->next; 

完整的解決方案會是東西

int FindMergeNode(Node *headA, Node *headB) { 
    Node *currentA = headA; 
    Node *currentB = headB; 

    //Do till the two nodes are the same 
    while(currentA != currentB){ 
     //If you reached the end of one list start at the beginning of the other one 
     //currentA 
     if(currentA->next == NULL){ 
      currentA = headB; 
     }else{ 
      currentA = currentA->next; 
     } 
     //currentB 
     if(currentB->next == NULL){ 
      currentB = headA; 
     }else{ 
      currentB = currentB->next; 
     } 
    } 
    return currentB->data; 
} 
+0

thx,我看到我錯過了。 –

+0

L. Dai請確認是否有用 –