合併兩個有序鍊錶,形成新的有序鍊錶

2021-09-24 18:42:38 字數 1395 閱讀 5091

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

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

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

題目分析:

任意一條鍊錶為空時,返回另一條鍊錶

遞迴方法:簡單快捷,直接比較煉表頭結點值的大小,運用遞迴,將第二個,第三個以及後面的結點,依次用遞迴當作頭結點比較。

分析過程:

每次都比較連個鍊錶的第乙個結點,留下兩個鍊錶中較小的結點,剩下的進入遞迴,每次都會去掉乙個較小結點,每個結點都會被函式遍歷一次,且合併後鍊錶為線性關係, 所以時間複雜度log(n+m),l1,l2每乙個結點都會進行被函式遍歷一次,所以函式棧幀呼叫n+m次,空間複雜度是o(n+m)。

遞迴

/**

* definition for singly-linked list.

* struct listnode

* };

*/class solution

if(l2==null)

if(l1->val < l2->val)

else}};

非遞迴分析過程

注意

連線鍊錶時一定要注意前後節點的鏈結關係,保留val值較小的結點,較大的結點繼續先向後比較。

新new出來的結點為了記錄鍊錶的頭結點。

因為l1l2都是有序鍊錶,當任意一條鍊錶為空時,一定注意,當前的prev還未與下乙個結點鏈結上,我們需要另外判斷哪一條鍊錶為空,將prev->next鏈上非空的鍊錶。

class solution 

if(l2==null)

listnode* phead=new listnode(-1);

listnode* prev=phead;

while(l1 !=null && l2 != null)

else

prev=prev->next;

}if(l1==null)

if(l2==null)

return phead->next;}};

兩個有序鍊錶合併為有序

include 兩個有序遞增的單鏈表 有頭結點 合併為新單鏈表。include 用尾插法表示這兩個鍊錶較好,因為這樣建立鍊錶是有序的,遞增的。如果用頭插法,for迴圈改為for i n i 0,i 使其新建的鍊錶遞增 typedef struct lnode lnode lnode creat ln...

合併兩個有序鍊錶

鍊錶的題目總是讓我很惆悵。動輒就會runtime error。比如這題,額外用了乙個節點的空間來儲存頭節點。我很不情願多用這個空間,不過貌似不行。貌似不行,實際可行,見附錄。把頭節點提出迴圈 實現類 class solution else if l1 null p next l1 if l2 nul...

合併兩個有序鍊錶

三個指標乙個儲存la鍊錶 乙個儲存lb鍊錶,乙個指向新的鍊錶。鍊錶的插入,兩個指標,乙個是head,乙個指向head後面的鏈,新插入的元素位於head後面。執行該 自己外加上class類。static class node public static void main string args st...