最 近在網上沖浪的時候,我發現了一個有意思的討論: 互聯網公司裏為啥很少有山東大學呢? 這個問題我有點好奇萬能的網友們會怎麽說,於是進去看了看,沒想到網友回答出奇一致。
貼文裏,有個網友表示,幾家公司了,但他竟然一個山大的學生都沒遇見過。我仔細想了下,似乎真的很少聽說山東大學出身的互聯網從業者。
不過,一個人的社交圈有限,能接觸到的同事和行業內的人也就那麽多,你沒看到,不代表沒有。但是網友們的回答卻出奇的一致:山東大學的大部份去考公了。
透過網友的回復,可以看到這種趨勢確實存在。但也有網友回答有很多啊,可能只是你沒碰到。
所以,互聯網行業並不是沒有山東大學的從業者。只不過,相比之下比較少。
下面是今日大廠演算法題
今日演算法題,來自LeetCode的第21題:合並兩個有序連結串列,下面是我的演算法思路及實作,讓我們來看看吧。
# 演算法題目
將兩個升序連結串列合並為一個新的 升序 連結串列並返回。新連結串列是透過拼接給定的兩個連結串列的所有節點組成的。
# 演算法思路
建立一個啞節點:這個啞節點將作為結果連結串列的起始節點,這樣可以簡化邊界條件的處理,最後返回它的下一個節點作為合並後的連結串列頭。
叠代比較:比較兩個連結串列當前節點的值,將較小值的節點接在結果連結串列的後面,並移動該連結串列的指標到下一個節點。
連線剩余部份:如果兩個連結串列的長度不同,將較長連結串列的剩余部份直接接在結果連結串列的後面。
返回結果:返回啞節點的下一個節點,即合並後連結串列的頭節點。
# 程式碼實作
C語言實作
#include<stdlib.h>
structListNode {
int val;
structListNode *next;
};
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2){
structListNodedummy;
structListNode *tail = &dummy;
dummy.next = NULL;
while (l1 && l2) {
if (l1->val < l2->val) {
tail->next = l1;
l1 = l1->next;
} else {
tail->next = l2;
l2 = l2->next;
}
tail = tail->next;
}
tail->next = l1 ? l1 : l2;
return dummy.next;
}
Java實作
public classListNode{
int val;
ListNode next;
ListNode() {}
ListNode(int val) { this.val = val; }
ListNode(int val, ListNode next) { this.val = val; this.next = next; }
}
public classSolution{
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode dummy = new ListNode(-1);
ListNode tail = dummy;
while (l1 != null && l2 != null) {
if (l1.val < l2.val) {
tail.next = l1;
l1 = l1.next;
} else {
tail.next = l2;
l2 = l2.next;
}
tail = tail.next;
}
tail.next = l1 != null ? l1 : l2;
return dummy.next;
}
}
Python實作
classListNode:
def__init__(self, val=0, next=None):
self.val = val
self.next = next
defmerge_two_lists(l1, l2):
dummy = ListNode()
tail = dummy
while l1 andl2:
if l1.val < l2.val:
tail.next = l1
l1 = l1.next
else:
tail.next = l2
l2 = l2.next
tail = tail.next
tail.next = l1 if l1 else l2
return dummy.next
# 演算法解析
這個演算法的時間復雜度是O(n+m),其中n和m分別是兩個連結串列的長度。這是因為我們只需要一次遍歷就能完成合並。空間復雜度是O(1),我們只需要常數空間儲存幾個指標。
# 範例和測試
假設有兩個連結串列 l1: 1->2->4 和 l2: 1->3->4,合並後的連結串列是 1->1->2->3->4->4。
# 總結
合並兩個有序連結串列是一個非常基礎且實用的連結串列操作問題,它不僅能幫助我們熟悉連結串列的基本操作,還能訓練我們使用指標進行有效的連結串列操作。
熱門推薦