劍指每日一題 合併遞增鍊錶為單調不減鍊錶

2021-10-04 05:04:01 字數 2541 閱讀 2081

最近在練習程式設計題目,每天寫一道以上劍指程式設計題。加油,堅持就是勝利!

這是劍指上的乙個鍊錶題目。

輸入兩個單調遞增的鍊錶,輸出兩個鍊錶合成後的鍊錶,當然我們需要合成後的鍊錶滿足單調不減規則。

這道題有兩種思路,一種是遞迴方式解決,這個方式的**較為簡單,但是時間複雜度會比較高,另一種是非遞迴方式解決。遞迴方式不講,大體講一下非遞迴方式的思路。

非遞迴方式的流程:首先通過比較phead1和phead2兩個結點的值,來確定新鍊錶的表頭head,將表尾tail也指向表頭head。之後通過乙個while迴圈,每次通過比較phead1和phead2兩個結點的值來構建新鍊錶,直到phead1或者phead2全部遍歷完,迴圈結束。由於此時phead1和phead2兩個鍊錶中還有乙個沒有遍歷完(不是null),所以還需要把phead1或者是phead2剩餘的鍊錶鏈結到tail後面。最後return表頭也就是head。

(1)遞迴**

class

solution

else

return head;}}

;

(2)非遞迴**

class

solution

//這裡是為了構建好新鍊錶的表頭head,也就是以phead1和phead2中較小的結點作為新煉表表頭head

else

//這裡和上面乙個意思

tail=head;

//此時將tail表尾指向head表頭

while

(phead1&&phead2)

//while迴圈是主體部分,構建新鍊錶。

else

tail=tail-

>next;

//由於tail一直指向表尾,所以這裡tail指向tail->next。}if

(phead2)

//由於phead1或者phead2可能還沒有全部構建到新鍊錶中,這裡需要把剩餘部分掛到新鍊錶後面。

else

if(phead1)

//和上面乙個意思

return head;}}

;

給出乙個鍊錶,每 k 個節點一組進行翻轉,並返回翻轉後的鍊錶。k 是乙個正整數,它的值小於或等於鍊錶的長度。如果節點總數不是 k 的整數倍,那麼將最後剩餘節點保持原有順序。

說明:你需要自行定義鍊錶結構,將輸入的資料儲存到你的鍊錶中;

你不能只是單純的改變節點內部的值,而是需要實際的進行節點交換;

你的演算法只能使用常數的額外空間。

輸入描述:

第一行輸入是鍊錶的值

第二行輸入是k的值,k是大於或等於1的整數

輸入形式為:

1 2 3 4 5

2輸出描述:

當 k = 2 時,應當輸出:

2 1 4 3 5

當 k = 3 時,應當輸出:

3 2 1 4 5

當k=6時,應當輸出:

可以採用遞迴的思想,每次對k個結點進行反轉,並且返回k個結點反轉後的頭結點。

下面描述了一下在k=3的條件下,reverse(listnode *head,int k)函式在一次遞迴的結點變化過程。可以看到,在k=3的條件下,前面3個結點最後順序被反轉。

K個公升序鍊錶合併 (每日一題)

給你乙個鍊錶陣列,每個鍊錶都已經按公升序排列。請你將所有鍊錶合併到乙個公升序鍊錶中,返回合併後的鍊錶。示例 輸入 lists 1,4,5 1,3,4 2,6 輸出 1,1,2,3,4,4,5,6 解釋 鍊錶陣列如下 1 4 5,1 3 4,2 6 將它們合併到乙個有序鍊錶中得到。1 1 2 3 4 ...

劍指Offer每日一題09

輸入兩個遞增排序的鍊錶,合併這兩個鍊錶並使新鍊錶中的節點仍然是遞增排序的。示例 輸入 1 2 5 null 2 4 7 null 輸出 1 2 2 4 5 7 null限制 0 鍊錶長度 1000 方法一 正常哨兵結點求解 class solution else prev prev.next 迴圈結...

劍指Offer每日一題08

定義乙個函式,輸入乙個鍊錶的頭節點,反轉該鍊錶並輸出反轉後鍊錶的頭節點。示例 輸入 1 2 3 4 5 null 輸出 5 4 3 2 1 null 限制 0 節點個數 5000 方法一 日常雙指標,好用不要錢public class listnode public listnode reverse...