LeetCode Merge k Sorted Lists (鏈表)

題意

Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
將K個排好序的鏈表合併成一個

解法

和之前合併兩個有序鏈表那題不同,那題用的是兩個指針來分別記錄兩個鏈表中的位置,將小的那個插入新鏈表然後指針右移,有點像歸併排序時用到的方法。這題如果用K個指針來記錄的話,每次需要找出最小的那個值,比較麻煩,所以採用的優先隊列,首先將所有鏈表的第一個值入隊,然後每次將值最小的一個出隊插入新鏈表裏,再將這個元素的下一個元素入隊。

class Solution
{
	struct	Node
	{
		int	val;
		ListNode	* next = nullptr;
		bool	operator <(const Node & r) const
		{
			return	val > r.val;
		}
	};
public:
	ListNode* mergeKLists(vector<ListNode*>& lists)
	{
		int	count = lists.size();
		priority_queue<Node>	que;

		for(int i = 0;i < lists.size();i ++)
		{
			Node	temp;
			if(lists[i])
			{
				temp.val = lists[i] -> val;
				temp.next = lists[i] -> next;
				que.push(temp);
			}
		}

		ListNode	* head = nullptr;
		ListNode	* cur = nullptr;
		while(!que.empty())
		{
			ListNode	* node = new ListNode(0);
			Node	poped = que.top();
			que.pop();
			node -> val = poped.val;
			node -> next = poped.next;
			if(poped.next)
			{
				Node	temp;
				temp.val = poped.next -> val;
				temp.next = poped.next -> next;
				que.push(temp);
			}


			if(head == nullptr)
			{
				head = node;
				cur = node;
			}
			else
			{
				cur -> next = node;
				cur = cur -> next;
			}
		}
		return	head;
	}
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章