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...