Leetcode合併兩個有序鍊錶演算法與分析

2021-09-25 05:41:12 字數 1533 閱讀 4936

@leetcode合併兩個有序鍊錶

想必每乙個接觸過鍊錶這種資料結構的coder都會對鍊錶的合併有所了解,而兩個有序鍊錶的合併則是其中較為簡單的一部分,不多說,來看題幹:

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

示例:

輸入:1->2->4, 1->3->4

輸出:1->1->2->3->4->4

/**

* definition for singly-linked list.

* struct listnode

* };

*/

上面的**是題目給出的這段鍊錶的基本資訊,之後的很多題目中都會在編寫之前給出這些資訊,我就不再單獨寫出來了。可以看出這是兩個很基本的單鏈表,只有乙個val表示值和指向後繼結點的指標,所以解決這個問題,我們也不需要使用很複雜的思路,當然,大佬們總是有有意思的各種思路的解法,在這裡我分享其中兩種比較簡單的思路,分別是非遞迴的迭代思路和遞迴形式的思路:

首先是非遞迴的思路:

**如下:

這段**寫的真是史詩級的囉嗦啊,最後20行的比較寫的甚是複雜,後來發現只需要一句話就可以搞定:

l3->next = l1 != null ? l1 : l2;
話雖如此,但這種迭代交換的思想就是如此,這是使用開闢新的鍊錶的方法的典型做法,通過比較每個鍊錶結點的大小來決定誰插入l3,當然也有不用開闢新的鍊錶的做法,但共同之處是都需要建立乙個新的頭結點來表示儲存最後結果的鍊錶,這是為了返回而考慮的,定義語句如下:

listnode* head=new listnode(-1);

listnode* l3=head;

需要注意的是,最後返回一定是head->next,因為我們是從l3->next開始加鍊表結點的,當然你也可以把這些next都去掉試一試,但能不能成功通過我就不敢保證了哈。

class

solution

else}}

;

遞迴與迭代的思路是相同的,只是返回出口放在了最前面這一點不太相同,當然,遞迴就不再需要開闢新鍊錶了。

LeetCode 合併兩個有序鍊錶

將兩個有序鍊錶合併為乙個新的有序鍊錶並返回。新煉表是通過拼接給定的兩個鍊錶的所有節點組成的。示例 輸入 1 2 4,1 3 4輸出 1 1 2 3 4 4class solution else listnode p new head while l1 null l2 null else p p ne...

LeetCode 合併兩個有序鍊錶

將兩個有序鍊錶合併為乙個新的有序鍊錶並返回。新煉表是通過拼接給定的兩個鍊錶的所有節點組成的。示例 輸入 1 2 4,1 3 4 輸出 1 1 2 3 4 4 struct listnode mergetwolists struct listnode l1,struct listnode l2 els...

leetcode 合併兩個有序鍊錶

definition for singly linked list.public class listnode class solution if l2 null listnode retnode null listnode temnode null while l1 null l2 null el...