所以這是一個LeetCode 問題。主要目標是合并兩個排序串列,但這不是問題。我查看了下面的解決方案,我真的很困惑,原因有兩個。
- 為什么我們要使用假人頭?
- 為什么我們分配給下一個節點而不是當前節點
我試圖理解它,但是,我無法理解這個邏輯。我列印陳述句以查看引擎蓋下發生了什么,但仍然讓我感到困惑,為什么我們這樣做node.next = new ListNode(list1.val);而不是node = new ListNode(list1.val);. 使用node = new ListNode(list1.val);回傳一個空串列,我不知道為什么
var mergeTwoLists = function (list1, list2) {
const head = new ListNode(0);
let node = head;
while (list1 !== null || list2 !== null) {
if (list2 === null || (list1 !== null && list1.val <= list2.val)) {
node.next = new ListNode(list1.val);
list1 = list1.next;
} else {
node.next = new ListNode(list2.val);
list2 = list2.next;
}
node = node.next;
}
return head.next;
};
uj5u.com熱心網友回復:
為什么我們要使用假人頭?
簡化回圈中的代碼。它可以在沒有 dummy 的情況下完成,但是代碼看起來像這樣:
let head = null; // no dummy
let node = head;
while (list1 !== null || list2 !== null) {
if (list2 === null || (list1 !== null && list1.val <= list2.val)) {
if (node == null) { // First time only -- need to assign to head
head = new ListNode(list1.val);
} else { // all other times:
node.next = new ListNode(list1.val);
}
list1 = list1.next;
} else {
if (node == null) { // First time only -- need to assign to head
head = new ListNode(list2.val);
} else { // all other times:
node.next = new ListNode(list2.val);
}
list2 = list2.next;
}
node = node.next;
}
return head; // There's no dummy, so return real head
注意我們必須如何在回圈內部區分我們還沒有頭節點并且必須分配給它的情況以及所有其他情況。隨著虛擬節點的引入,回圈中不需要這種區分,在回圈之后我們可以跳過那個虛擬節點來找到真正的頭(head.next)。
為什么我們分配給下一個節點而不是當前節點
為了建立一個鏈表,你需要分配給next節點的屬性。如果您不分配給next屬性,而是分配給變數,則不會構建任何串列。如果您只是這樣做node = new ListNode((list2.val),您將創建一個節點并將其分配給一個變數,但它不會成為更大鏈表的一部分。更糟糕的是,當您在下一次迭代中再次執行此操作時,您將失去對在上一次迭代中創建的上一個節點的參考——沒有辦法找回它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/490228.html
標籤:javascript
上一篇:如何使用MUIReact為Item1左對齊并為Item2和Item3右對齊?
下一篇:Linux-安裝ifconfig
