LeetCode#21-Merge Two Sorted Lists-合併兩個有序連結串列
阿新 • • 發佈:2020-04-08
#### 一、題目
將兩個升序連結串列合併為一個新的升序連結串列並返回。新連結串列是通過拼接給定的兩個連結串列的所有節點組成的。
示例:
```
輸入:1->2->4, 1->3->4
輸出:1->1->2->3->4->4
```
#### 二、題解
- 解法1:遞迴
終止條件:兩條連結串列分別為 l1 和 l2,當 l1 為空或 l2 為空時結束。
如何遞迴:判斷 l1 和 l2 頭結點哪個更小,然後較小結點的 next 指標指向其餘結點的合併結果。(呼叫遞迴)
**時間複雜度:O(n+m);空間複雜度:O(n+m)。**
![](https://img2020.cnblogs.com/blog/953680/202004/953680-20200408012023442-1783353532.png)
```php
val = $val;
}
}
/**
* @param ListNode $l1
* @param ListNode $l2
* @return ListNode
*/
function mergeTwoLists($l1, $l2) {
if ($l1 == null) {
return $l2;
}
if ($l2 == null) {
return $l1;
}
if ($l1->val <= $l2->val) {
$l1->next = mergeTwoLists($l1->next, $l2);
return $l1;
}
if ($l2->val <= $l1->val) {
$l2->next = mergeTwoLists($l2->next, $l1);
return $l2;
}
}
/**
* 構建一個單鏈表(將陣列轉換成連結串列)
*/
function createLinkedList($arr)
{
$linkedList = [];
$current = new ListNode(array_shift($arr)); //頭節點
while (!empty($arr)) {
while ($current->next != null) {
$linkedList[] = $current;
$current = $current->next;
}
$current->next = new ListNode(array_shift($arr));
}
return $linkedList[0];
}
$l1 = createLinkedList([1,2,4]);
$l2 = createLinkedList([1,3,5]);
$res = mergeTwoLists($l1, $l2);
print_r($res);
```
得到的結果如下:
```
ListNode Object
(
[val] => 1
[next] => ListNode Object
(
[val] => 1
[next] => ListNode Object
(
[val] => 2
[next] => ListNode Object
(
[val] => 3
[next] => ListNode Object
(
[val] => 4
[next] => ListNode Object
(
[val] => 5
[next] =>
)
)
)
)
)
)
```
- 解法2:迭代
設定一個哨兵節點,用來返回合併後的連結串列,維護一個 `pre` 節點,調整它的 `next` 指標。
當 l1 當前位置的值小於等於 l2,就將 `pre` 節點的 `next` 指向 l1 的這個值,同時將 l1 指標往後移一個。反之則對 l2 做同樣的操作,直到 l1 或者 l2 指向 null。當迴圈終止的時候,l1 和 l2 至多有一個是非空的。
由於輸入的兩個連結串列都是有序的,所以不管哪個連結串列是非空的,只需要將剩下的那個非空連結串列接在合併連結串列的後面,並返回合併連結串列即可。
**時間複雜度:O(n+m);空間複雜度:O(n+m)。**
![](https://img2020.cnblogs.com/blog/953680/202004/953680-20200408012041652-71713864.png)
```php
/**
* @param ListNode $l1
* @param ListNode $l2
* @return ListNode
*/
function mergeTwoLists($l1, $l2) {
// 設定一個哨兵
$node = new ListNode(null);
$pre = $node;
while ($l1 != null && $l2 != null) {
if ($l1->val < $l2->val) {
$pre->next = $l1;
$l1 = $l1->next;
} else {
$pre->next = $l2;
$l2 = $l2->next;
}
$pre = $pre->next;
}
if ($l1 == null) {
$pre->next = $l2;
}
if ($l2 == null) {
$pre->next = $l1;
}
return $node->nex