leetcode 21兩個有序鍊錶的合併

2021-10-14 23:20:30 字數 1894 閱讀 3936

將兩個公升序鍊錶合併為乙個新的 公升序 鍊錶並返回。新煉表是通過拼接給定的兩個鍊錶的所有節點組成的。

示例 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...