Cover image for Interview Classic 150 Problem P23: Merge K Sorted Linked Lists

Interview Classic 150 Problem P23: Merge K Sorted Linked Lists


Timeline

Timeline

2025-12-01

init

Divide and Conquer

Problem:

Directly use a stack to implement the merge non-recursively.

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
struct ListNode {	int val;	ListNode *next;	ListNode()		: val(0)		, next(nullptr)	{	}	ListNode(int x)		: val(x)		, next(nullptr)	{	}	ListNode(int x, ListNode *next)		: val(x)		, next(next)	{	}};#include <vector>#include <queue>using std::vector;using std::queue;class Solution {    private:	ListNode *merge2List(ListNode *l1, ListNode *l2)	{		ListNode dummy;		ListNode *tail = &dummy, *tmp;		while (l1 && l2) {			if (l1->val < l2->val) {				tmp = l1;				l1 = l1->next;			} else {				tmp = l2;				l2 = l2->next;			}			tail->next = tmp;			tail = tail->next;		}		tail->next = l1 == nullptr ? l2 : l1;		return dummy.next;	}    public:	ListNode *mergeKLists(vector<ListNode *> &lists)	{		int n = lists.size();		if (n == 0) {			return nullptr;		} else if (n == 1) {			return lists[0];		}		queue<ListNode *> que;		for (ListNode *&node : lists) {			que.push(node);		}		ListNode *l1, *l2;		while (que.size() != 1) {			l1 = que.front();			que.pop();			l2 = que.front();			que.pop();			que.push(merge2List(l1, l2));		}		return que.front();	}};

leetcode hot 100 rewrite:

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
struct ListNode {        int val;        ListNode *next;        ListNode()                : val(0)                , next(nullptr)        {        }        ListNode(int x)                : val(x)                , next(nullptr)        {        }        ListNode(int x, ListNode *next)                : val(x)                , next(next)        {        }};#include <vector>using std::vector;class Solution {    public:        ListNode *mergeKLists(vector<ListNode *> &lists)        {                int i, n = lists.size();                ListNode dummy, *tail = &dummy, **curr_min;                while (1) {                        curr_min = nullptr;                        for (ListNode *&p : lists) {                                if (p == nullptr)                                        continue;                                if ((curr_min == nullptr) || ((*curr_min)->val > p->val))                                        curr_min = &p;                        }                        if (curr_min == nullptr)                                break;                        tail->next = *curr_min;                        tail = tail->next;                        *curr_min = (*curr_min)->next;                }                return dummy.next;        }};
Loading comments…