將兩個有序鍊錶合併為乙個新的有序鍊錶並返回。新煉表是通過拼接給定的兩個鍊錶的所有節點組成的。
示例:輸入: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出來的結點為了記錄鍊錶的頭結點。
因為l1
和l2
都是有序鍊錶,當任意一條鍊錶為空時,一定注意,當前的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...