使用遞迴進行鍊錶合併

2021-09-27 08:30:49 字數 1688 閱讀 9209

leetcode上有合併鍊錶的題,大概是說將k個公升序鍊錶合成1個公升序鍊錶。(附上原題)

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

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

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

/**

* definition for singly-linked list.

* struct listnode ;

*/struct listnode* mergetwolists(struct listnode* l1, struct listnode* l2) else

}

這是乙個很標準的遞迴求解方法;後來我在論壇裡看到乙個老哥發了乙個貼:

看完完之後感覺很熟悉,但是合併之後的增減性變了。那麼已開始是無法確定鍊錶的頭結點的(不知道兩個子鍊錶的結尾誰的大)。這時候需要自底向上解決問題,所以我使用尾遞迴來嘗試解決這個問題。總體思想是:merge返回合併之後的尾節點,然後尾節點指向當前l1和l2的較大值,再返回較小值作為新的尾節點。(想象一下把拉鍊從底向上拉起來的過程)

list* merge(list* l1, list* l2, list *head) 

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

return l1;

} if ((l1 == null) && (l2 != null))

return l2;

} else if (l1->val > l2->val)

else

return l2;

} else

list* pre = merge(l1->next, l2, head);

if (pre == l2)

else

return l1;

}}

遞迴的程式分支和第一道題是一樣的,只是這次遞迴需要修改把結點指標重新賦值(容易寫懵逼)測試一波:

C 實現鍊錶遞迴和非遞迴合併

1.使用遞迴和非遞迴實現鍊錶的合併 輸入兩個單調遞增的鍊錶,輸出兩個鍊錶合成後的鍊錶,要求合成後的鍊錶滿足單調不減規則。2.實現 struct listnode 遞迴實現合併兩個排序鍊錶 listnode merge listnode phead1,listnode phead2 else 非遞迴實...

合併兩個排序的鍊錶 鍊錶 遞迴

題目描述 輸入兩個單調遞增的鍊錶,輸出兩個鍊錶合成後的鍊錶,當然我們需要合成後的鍊錶滿足單調不減規則。思路分析 用遞迴思想,依次將兩個鍊錶的每個元素遞迴對比後實現,注意此題考查 的魯棒性,故判斷條件不能少!function listnode x function merge phead1,phead...

合併K組鍊錶以及合併兩個鍊錶(遞迴快速排序)

合併k組鍊錶 思路 剛開始打算兩兩合併,時間複雜度太高為n 合併兩個鍊錶的複雜度 會超出時間限制 於是暴力提取鍊錶 n nlgn n 快排,建立鍊錶 8ms超過100 的使用者 段如下 思路2 void swap int x,int y void quick sort recursive int a...