將兩個公升序鍊錶合併為乙個新的 公升序 鍊錶並返回。新煉表是通過拼接給定的兩個鍊錶的所有節點組成的。
示例 1:
輸入:l1 = [1,2,4], l2 = [1,3,4]
輸出:[1,1,2,3,4,4]
示例 2:
輸入:l1 = , l2 =
輸出:示例 3:
由於鍊錶的遍歷不能回頭,所以我採取使用輔助鍊錶,在兩個鍊錶遍歷的時候通過比較,將較小的乙個插到輔助鍊錶。這樣只需用l1l2和輔助鍊錶通過一次遍歷實現合併。
2.1.1複雜度分析
時間複雜度:對於每個資料做一次比較插入o(n)
空間複雜度:只需兩個指標的空間o(1)
2.1.2**
* definition for singly-linked list.
* struct listnode
* listnode(int x) : val(x), next(nullptr) {}
* listnode(int x, listnode *next) : val(x), next(next) {}
* };
*/class solution
else
//為了避免這種情況,l1l2的第乙個val相等時,賦值與插入應選不同的l
listnode* end=head;
while(l2!=null&&l1!=null)//插入
else
end=end->next;
}if(l2==null)
end->next=l1;
else
end->next=l2;
return head;
}};
如何計算遞迴的時間複雜度和空間複雜度呢? 力扣對此進行了 詳細介紹 ,其中時間複雜度可以這樣計算:
遞迴的時間複雜度
給出乙個遞迴演算法,其時間複雜度o(t
)(t)}
o(t)
遞迴呼叫的數量,記作r
r 計算的時間複雜度o(s
)(s)}
o(s)
那麼o (t
)=r∗
o(s)
o(t)=r∗o(s)
o(t)=r
∗o(s
)該題的時間複雜度:o(n
)}(n)
o(n)
分析:m,n 為 l1和 l2 的元素個數。遞迴函式每次去掉乙個元素,直到兩個鍊錶都為空,因此 r=m
+n
r=m+n
r=m+
n在遞迴函式中只進行了 next 指標的賦值操作,計算的時間複雜度為 o(1
)o(1)
o(1)
故遞迴的總時間複雜度為o(t
)=r∗
o(1)
=o(n
)(t) = r * \mathcal(1)}=}( n)
o(t)=r
∗o(1
)=o(
n)空間複雜度
計算整個演算法的輔助空間單元的個數
呼叫的空間中儲存常量級資料則o(1
)o(1)
o(1)
呼叫的空間中儲存n個資料則o(n
)o(n)
o(n)
呼叫的空間中儲存n^2個資料則o(n
2)
o(n^2)
o(n2
)該題的空間複雜度
o (n
)o(n)
o(n)
class solution
if (l2 == null)
if (l1->val <=l2->val)//使用遞迴不會有2.1.1中next指自己的情況
else
}};
leetcode21 合併兩個有序鍊錶
將兩個有序鍊錶合併為乙個新的有序鍊錶並返回。新煉表是通過拼接給定的兩個鍊錶的所有節點組成的。示例 輸入 1 2 4,1 3 4 輸出 1 1 2 3 4 4 思路 每次判斷兩個鍊錶的頭部小的數值,訪問小的,並讓該鍊錶往後移動。注意 注意鍊錶走完,為空的情況即可。遇到的問題 一開始不太理解鍊錶,返回e...
LEETCODE 21 合併兩個有序鍊錶
將兩個有序鍊錶合併為乙個新的有序鍊錶並返回。新煉表是通過拼接給定的兩個鍊錶的所有節點組成的。示例 輸入 1 2 4,1 3 4 輸出 1 1 2 3 4 4c 第一遍將 相等 的這個else分支寫錯了,主要錯誤在於,next指標指向下乙個的這條語句寫到了後面,導致節點自己指向自己,造成了超時錯誤 執...
leetcode 21 合併兩個有序鍊錶
將兩個有序鍊錶合併為乙個新的有序鍊錶並返回。新煉表是通過拼接給定的兩個鍊錶的所有節點組成的。示例 輸入 1 2 4,1 3 4 輸出 1 1 2 3 4 4 definition for singly linked list.struct listnode class solution else t...