# 2023 年「[資訊科技產業專案設計](https://hackmd.io/@sysprog/info2023)」作業 2
> 貢獻者: 月前龍馬-lonmu
> [模擬面試: 漢](https://youtu.be/Ire86ptjVtI)
**R**epeat
**E**xample
**A**pproach
**C**ode
**T**est
**O**pmization
## [21. Merge Two Sorted Lists](https://leetcode.com/problems/merge-two-sorted-lists/)
🧔 : interviewer 👶:interviewee
🧔 : 您好 今天由我來主詞這場面試,這邊有個問題想要請你解一下,因為本公司有經營電子商務等相關業務,平常儲存訂單的內容我們會以singly ordered linked list去儲存 想請問那如果想合併兩個客戶的資料 而且預期得到以訂單編號由小到大合併好的結果 可以說明一下你會怎麼做
### repeat & exmaple
👶 : 我可以理解為今天資料由 singly ordered linked list 去儲存 那想要合併兩個客戶資料 那就是將 兩個 singly ordered linked list 合併為一個 singly ordered linked list
簡單帶個例子 e.g. list1: 1->5, list2: 2->4, expected result: 1->2->4->5 這樣我對題目的理解是對的嗎
🧔 : 沒錯 你對題目的理解是對的
### approach
👶 : 好的,那我這邊目前想到的方法為,先新開一個之後要回傳的空節點指標ans,和一個指向尾端的tail指標,使用while的方式當兩個linked list皆不為空,則將兩者擁有較小值的Head node的list,接到要回傳的ans的尾端,並將tail和該list指向下一個node做更新,而當兩者其中一條linked list為空時,跳出迴圈,並將不為空的linked list再接到ans list後方即完成merge了
// new node ptr: ans, tail
// while twolist both are not empty
// link the list which has the smaller head to the tail
// update tail and the respond list
// check two list and link the rest one
🧔 : 方法大致沒問題 那你可以開始 implement 剛剛討論的方法了
### code & test
👶 : coding. . . finished 帶入example 解釋code沒問題
```cpp=
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
// e.g. list1 = 1->5, list2 = 2->4; expected result: 1->2->4->5;
// ans = dummy->1->2->4->5, return ans
ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
ListNode* ans = new ListNode;
ListNode* tail = ans;
while(list1&& list2){
if(list1->val < list2->val){ //link list1 head & update
tail->next = list1;
list1 = list1->next;
}
else{ // link list2 head & update
tail->next = list2;
list2 = list2->next;
}
tail = tail->next;
}
// link the rest one
if(list1){ tail->next = list1;}
else{tail->next = list2;}
return ans->next;
}
```
🧔 : ok 那可以分析一下 你寫的程式 他的時間複雜度如何
👶 : 由於 while 迴圈的執行次數是取決於兩個 list 中較短者,假設 list 長度分別為 n 與 m ,時間複雜度為 O(n+m)。
🧔 : ok
### follow up => [23. Merge k Sorted Lists](https://leetcode.com/problems/merge-k-sorted-lists/)
🧔 : 那今天系統有需求 需要合併的不是僅有兩個客戶的資料 而是同時有多個人的話你會怎麼做 鑒於時間關係 你可以大概說明你的想法就可以了
👶 : 可以使用 merge sort divide&conquer的概念 使用recursion陸續兩兩分堆做到divide的步驟 後再開始conquer 運用剛剛寫的程式碼 兩條兩條list去做merge 最後合併成一條 linked list
e.g. vector list: a,b,c,d,e
=> 1st level merge: ab, cd ,e
=> 2nd level merge: abcd,e
=> 3rd level merge: abcde
🧔 : 好 那今天就先到這邊 稍待與主管和人資討論 再連絡你 謝謝
## 初步檢討
* 影片中的方法概要的註解下的不夠精確,有可能導致interviewer誤解,後來將較精確的註解寫於本篇[approach](https://hackmd.io/dFTkZYO6RmKo-iFLTpZdlw?both#repeat-amp-exmaple)中
* 邊寫程式邊講解仍有一定難度,且因註解不精確,偶爾會口誤容易讓人誤解,例如
[2:20](https://youtu.be/Ire86ptjVtI?t=140)-講成較小條list 應該是有較小值head的list
[6:10](https://youtu.be/Ire86ptjVtI?t=360)-講成較短的list接到tail。
* 題目本身interviewer包裝的不夠,還是蠻接近leetcode原題的
* 缺少optmization, follow-up部分僅簡單說明實作方法
* 語助詞過多,沒有注意一直講"然後"
---
## 第二次作業-他評模板
### 關於 interviewer
- [ ] 優點
- [ ] 可改進的地方
### 關於 interviewee
- [ ] 優點
- 寫code前的pseudocode不錯。
- [ ] 可改進的地方
- [預期得到這樣...](https://youtu.be/Ire86ptjVtI),或許直接照著講會比較好。
## 他評-01
### 關於 interviewer
- [ ] 可改進的地方
- [11:29](https://www.youtube.com/watch?v=Ire86ptjVtI&t=11m29s) 如果預期一個問題有20分鐘可以作答的話,剩下8分多鐘可以讓iterviewee在說完優化想法後試著開始寫程式,不用告訴interviewee因為時間不夠所以只講想法即可,說不定interviewee可以在剩下的時間內很快將想法實現。
### 關於 interviewee
- [ ] 優點
- [5:24](https://www.youtube.com/watch?v=Ire86ptjVtI&t=5m24s) 在寫code時,會在旁邊加上註解方便之後快速閱讀。
## 第四次作業-他評01
### 關於 interviewer
- [ ] 優點
- 問題陳述清楚。
- [ ] 可改進的地方
- [12:24](https://youtu.be/Ire86ptjVtI?t=744)這邊可以繼續討論此方法的時間複雜度等等。
### 關於 interviewee
- [ ] 優點
- [9:28](https://youtu.be/Ire86ptjVtI?t=568)test時候逐步分解 ,解釋詳細。
- [ ] 可改進的地方
- [7:07](https://youtu.be/Ire86ptjVtI?t=427)或許旁邊補上註解可以方便於interviewer 閱讀。
## 第四次作業-他評02
### 關於 interviewer
- [ ] 優點
- 問題包裝良好。
### 關於 interviewee
- [ ] 優點
- [03:41](https://youtu.be/Ire86ptjVtI?si=QGfTpsa5reqbMr8d&t=221)為止,REACTO的REA做得很完整,有適當舉例幫助了解,也有向主持人確認做法才開始實作。
- [ ] 可改進的地方
- [07:03](https://youtu.be/Ire86ptjVtI?si=wU7cpvaCmgOBvUqA&t=423)雖然你用反白標示出你在講什麼部分很好,但又配上滑鼠游標畫圈的動作,就扣分回來了,老師在上課有提到,應避免如此畫圈行為。
- 整個coding下來,雖然在文件最上面已經用註解表示全體流程,但建議在coding時還是要把這個區塊在做什麼,把註解寫在該區塊,會清楚點。
## 第四次作業-他評03
* 問題有給予情境結合生活應用
* [1:54](https://youtu.be/Ire86ptjVtI?t=114)
把要做的方法講解的很清楚
對於要設立的變數也有清楚說出來
* [7:04](https://youtu.be/Ire86ptjVtI?t=424)
滑鼠指標有反白要說的程式碼即可
* [7:49](https://www.youtube.com/watch?v=Ire86ptjVtI)
程式完成後說明即可,不要上下捲動
* [8:51](https://youtu.be/Ire86ptjVtI?t=531)
測資用例說明的很清楚
* [11:19](https://youtu.be/Ire86ptjVtI?t=679)
問題延伸得當,可以適時補充對於這個想法上的時間複雜度特別是針對 merge sort,可以讓interviewer 知道你對sort 的掌握度,Merge sort沒有最差與最佳的情況,時間複雜度都是n log(n),但因為使用了Recursion的方式,所以Merge sort在空間複雜度相對於其他演算法較高