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) { }};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) { }};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; }}; |
