劍指offer(面試題17) 合併兩個已排序的鍊錶

2021-08-17 16:49:06 字數 1138 閱讀 4083

我們要做的就是合併兩個有序鍊錶,使之合併之後依舊有序

那麼我們要怎麼做呢

首先我們從合併鍊錶的頭結點開始,首先鍊錶1的頭結點的值小於鍊錶2的頭結點的值,因此合併後新鍊錶的頭結點即鍊錶1的頭結點,

然後我們繼續往後遍歷,畫圖如下

就這樣按圖上的一直往下遍歷,那遍歷結束的標誌又是什麼呢

就是只要是任意乙個鍊錶已經遍歷完了,cur指標指向空的時候,將另乙個沒有遍歷完的鍊錶直接加到新鍊錶的後面就行,因為剩下的鍊錶本身就是有序的

接下來就是**了

//合併兩個有序鍊錶,合併後依然有序

linknode *linknodemerge(linknode *head1, linknode *head2)

if (head2 ==

null)

if(head1 ==

null

&&head2 ==

null)

linknode *head =

null;//新鍊錶的頭指標

linknode *cur1 = head1;

linknode *cur2 = head2;

//找新鍊錶的頭結點

if (cur1->value > cur2->value)

else

//往新煉表中尾插節點

linknode *tail = head;

while (cur1 !=

null

&&cur2 !=

null)

else

tail = tail->next;

}//此時肯定有乙個鍊錶此時已經遍歷完,有乙個指標的已經為null

if (cur1 ==

null)

else

return head;

}//測試**:

void linknodemergetest()

執行結果:

劍指offer 面試題17

題目 合併兩個排序的單向鍊錶 自己所寫 如下 listnode mergesortedlists listnode phead1,listnode phead2 listnode mergetwolist listnode pfirst,listnode psecond if phead pnext...

劍指offer 面試題17 合併兩個排序的鍊錶

題目 輸入兩個遞增排序的鍊錶,合併這兩個鍊錶並使新鍊錶中的結點仍然是按照遞增排序的。思路 每次從兩個鍊錶中選取較小的結點作為新鍊錶的結點,那麼這裡有兩種方法,迴圈或者遞迴。1 迴圈,每次取出兩個鍊錶中較小的結點插入新鍊錶,到達其中乙個鍊錶的尾結點時,另外乙個鍊錶的其餘部分直接接在這個尾結點上。2 從...

劍指offer之面試題17 合併兩個排序的鍊錶

題目描述 輸入兩個單調遞增的鍊錶,輸出兩個鍊錶合成後的鍊錶,當然我們需要合成後的鍊錶滿足單調不減規則。思路 養成好習慣,一旦有鍊錶作為形參傳遞,都要對鍊錶是否為空做判斷,防止空指標異常,至於怎麼處理,稍後會講。當鍊表都不為空時,比較兩個鍊錶的頭結點值的大小,較小者作為新的頭結點儲存,不妨設較小的頭結...