每日一道筆試題 2020 9 19

2021-10-09 14:36:54 字數 2334 閱讀 3306

leetcode:21. 合併兩個有序鍊錶(簡單)

將兩個公升序鍊錶合併為乙個新的公升序鍊錶並返回。新煉表是通過拼接給定的兩個鍊錶的所有節點組成的。

示例:

輸入:1->2->4, 1->3->4

輸出:1->1->2->3->4->4

思路我們可以如下遞迴地定義兩個煉表裡的 merge 操作(忽略邊界情況,比如空煉表等):

也就是說,兩個鍊錶頭部值較小的乙個節點與剩下元素的 merge 操作結果合併。

演算法

我們直接將以上遞迴過程建模,同時需要考慮邊界情況。

如果 l1 或者 l2 一開始就是空鍊錶 ,那麼沒有任何操作需要合併,所以我們只需要返回非空鍊錶。否則,我們要判斷 l1 和 l2 哪乙個鍊錶的頭節點的值更小,然後遞迴地決定下乙個新增到結果裡的節點。如果兩個鍊錶有乙個為空,遞迴結束。

/**

* definition for singly-linked list.

* public class listnode

* listnode(int val)

* listnode(int val, listnode next)

* }*/class

solution

else

if(l2 == null)

else

if(l1.val < l2.val)

else

}}

複雜度分析:

時間複雜度:o(n+m)o(n + m)o(n+m),其中 nnn 和 mmm 分別為兩個鍊錶的長度。因為每次呼叫遞迴都會去掉 l1 或者 l2 的頭節點(直到至少有乙個鍊錶為空),函式 mergetwolist 至多只會遞迴呼叫每個節點一次。因此,時間複雜度取決於合併後的鍊錶長度,即 o(n+m)o(n+m)o(n+m)。

空間複雜度:o(n+m)o(n + m)o(n+m),其中 nnn 和 mmm 分別為兩個鍊錶的長度。遞迴呼叫 mergetwolists 函式時需要消耗棧空間,棧空間的大小取決於遞迴呼叫的深度。結束遞迴呼叫時 mergetwolists 函式最多呼叫 n+mn+mn+m 次,因此空間複雜度為 o(n+m)o(n+m)o(n+m)。

思路我們可以用迭代的方法來實現上述演算法。當 l1 和 l2 都不是空煉表時,判斷 l1 和 l2 哪乙個鍊錶的頭節點的值更小,將較小值的節點新增到結果裡,當乙個節點被新增到結果裡之後,將對應鍊錶中的節點向後移一位。

演算法

首先,我們設定乙個哨兵節點 prehead ,這可以在最後讓我們比較容易地返回合併後的鍊錶。我們維護乙個 prev 指標,我們需要做的是調整它的 next 指標。然後,我們重複以下過程,直到 l1 或者 l2 指向了 null :如果 l1 當前節點的值小於等於 l2 ,我們就把 l1 當前的節點接在 prev 節點的後面同時將 l1 指標往後移一位。否則,我們對 l2 做同樣的操作。不管我們將哪乙個元素接在了後面,我們都需要把 prev 向後移一位。

在迴圈終止的時候, l1 和 l2 至多有乙個是非空的。由於輸入的兩個鍊錶都是有序的,所以不管哪個鍊錶是非空的,它包含的所有元素都比前面已經合併鍊錶中的所有元素都要大。這意味著我們只需要簡單地將非空鍊錶接在合併鍊錶的後面,並返回合併鍊錶即可。

/**

* definition for singly-linked list.

* public class listnode

* listnode(int val)

* listnode(int val, listnode next)

* }*/class

solution

else

prev = prev.next;

}// 合併後 l1 和 l2 最多只有乙個還未被合併完,我們直接將鍊錶末尾指向未合併完的鍊錶即可

一道筆試題

看到一道筆試題,跟自己想的有點出入,就跑了下,看了看原因。我稍微改了下 include int main int argc,char argv 輸出結果 c 5 d 245 press any key to continue vc6.0 debug下的彙編 5 unsigned char a 0xa...

一道筆試題

上次去筆試的時候,有一道題,怎麼也沒做出來,當時也是很緊張,有些思路,但卻沒有做出來。有四個人要過乙個獨木橋,因為天比較黑,而且橋只能允許兩個人同時通過,並且他們只有乙個手電筒。四個人單獨同時橋的時間是1,2,5,8分鐘。問最短的時間是多少?當時我的答案 1和8,1回來,1 5,1回來,1 2 8 ...

一道筆試題

題目是這樣的 判斷乙個小於1000的正整數是否為素數。素數的定義就不說了,以下直接分析解法,畢竟是在寫與專業相關的東西,是給本專業的人看得,所以看的人應該有點基礎吧?求素數的問題是乙個數學上的難題,這是常識,但是本題目限制了最大範圍是在1000以內,所以就可以嘗試找出乙個足夠好的解了。首先給出乙個最...