最近在練習程式設計題目,每天寫一道以上劍指程式設計題。加油,堅持就是勝利!
這是劍指上的乙個鍊錶題目。
輸入兩個單調遞增的鍊錶,輸出兩個鍊錶合成後的鍊錶,當然我們需要合成後的鍊錶滿足單調不減規則。
這道題有兩種思路,一種是遞迴方式解決,這個方式的**較為簡單,但是時間複雜度會比較高,另一種是非遞迴方式解決。遞迴方式不講,大體講一下非遞迴方式的思路。
非遞迴方式的流程:首先通過比較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...