1. 程式人生 > >21. 合併兩個有序連結串列/23. 合併K個排序連結串列

21. 合併兩個有序連結串列/23. 合併K個排序連結串列

1.合併兩個有序連結串列
	 ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {

		 ListNode* Phead = new ListNode(0);
		 ListNode* l3 = Phead;
		 while (l1&&l2)
		 {
			 if (l1->val<l2->val)
			 {
				 l3->next = l1;
				 l1 = l1->next;
			 }
			 else
			 {
				 l3->next = l2;
l2 = l2->next; } l3 = l3->next; } if (l1)l3->next = l1; if (l2)l3->next = l2; return Phead->next; }
2.合併K個排序連結串列

分析:採用分治法,最後兩兩合併。

c++ leetcode ac:

class Solution {
 public:
	 ListNode* mergeKLists(vector<ListNode*>& lists) {
		 int
len = lists.size(); if (len == 0)return nullptr; if (len == 1)return lists[0]; return Partion(lists,0,len-1); } ListNode* Partion(vector<ListNode*>& lists,int low,int high) { int mid = (low + high) / 2; if (low == high)return lists[low]; if (low < high) { ListNode*
left = Partion(lists, low, mid); ListNode* right = Partion(lists,mid+1,high); return mergeTwoLists(left, right); } return nullptr; } ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { ListNode* Phead = new ListNode(0); ListNode* l3 = Phead; while (l1&&l2) { if (l1->val<l2->val) { l3->next = l1; l1 = l1->next; } else { l3->next = l2; l2 = l2->next; } l3 = l3->next; } if (l1)l3->next = l1; if (l2)l3->next = l2; return Phead->next; } };