生成隨機數
阿新 • • 發佈:2020-11-21
這裡寫目錄標題
合併兩個有序連結串列
將兩個升序連結串列合併為一個新的升序連結串列並返回。新連結串列是通過拼接給定的兩個連結串列的所有節點組成的
輸入:1->2->4, 1->3->4
輸出:1->1->2->3->4->4
方法1——遞迴
我們直接將以上遞迴過程建模,同時需要考慮邊界情況。
如果 l1 或者 l2 一開始就是空連結串列 ,那麼沒有任何操作需要合併,所以我們只需要返回非空連結串列。
否則,我們要判斷 l1 和 l2 哪一個連結串列的頭節點的值更小,然後遞迴地決定下一個新增到結果裡的節點。
ListNode* mergeTwoListsOne(ListNode* l1, ListNode* l2){
if(l1==NULL)return l2;
if(l2==NULL)return l1;
if(l1->val<l2->val){
l1->next=mergeTwoListsOne(l1->next,l2);
return l1;
}else{
l2->next=mergeTwoListsOne(l1,l2->next) ;
return l2;
}
}
方法2——迭代
每次從兩個連結串列中摘取一個節點下來,放到新的連結串列中
ListNode* mergeTwoListsTwo(ListNode* l1, ListNode* l2){
ListNode* head = new ListNode(-1);
ListNode* prev = head;
while (l1 != NULL && l2 != NULL) {
if (l1->val < l2->val) {
prev- >next = l1;
l1 = l1->next;
} else {
prev->next = l2;
l2 = l2->next;
}
prev = prev->next;
}
// 合併後 l1 和 l2 最多隻有一個還未被合併完,我們直接將連結串列末尾指向未合併完的連結串列即可
prev->next = l1 == NULL ? l2 : l1;
return head->next;
}