c++学习笔记:有序链表的合并
2018-03-05 15:18
459 查看
1. 以递归的方式
2. 直接合并
3. 合并k个有序链表
2. 直接合并
3. 合并k个有序链表
/* LeetCode_0023 Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. */ struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} };
1. 以递归的方式
ListNode* mergeTwo(ListNode* l1, ListNode* l2) { if (l1 == NULL) return l2; if (l2 == NULL) return l1; if (l1->val <= l2->val) { l1->next = mergeTwo(l1->next, l2); return l1; } if (l1->val > l2->val) { l2->next = mergeTwo(l1, l2->next); return l2; } }
2. 直接合并
ListNode* mergeTwo(ListNode* l1, ListNode* l2) { ListNode dummy(-1); ListNode* result = &dummy; while (l1&&l2) { if (l1->val <= l2->val) { result->next = l1; result = result->next; l1 = l1->next; } else if (l1->val > l2->val) { result->next = l2; result = result->next; l2 = l2->next; } } while (l1) result->next = l1; while (l2) result->next = l2; return dummy.next; }
3. 合并k个有序链表
ListNode *mergeKLists(vector<ListNode *> &lists) { if (lists.empty()) { return nullptr; } while (lists.size() > 1) { lists.push_back(mergeTwoLists(lists[0], lists[1])); lists.erase(lists.begin()); lists.erase(lists.begin()); } return lists.front(); } ListNode *mergeKLists(vector<ListNode *> &lists) { if (lists.empty()) return NULL; int len = lists.size(); while (len > 1) { for (int i = 0; i < len / 2; ++i) { lists[i] = mergeTwoLists(lists[i], lists[len - 1 - i]); } len = (len + 1) / 2; } return lists.front(); }
相关文章推荐
- 【C++】合并两个排序的链表,要求合并后仍然是有序的
- 剑指offer刷题之c++实现的合并两个有序的链表
- C++链表学习笔记
- 算法学习----合并两个有序的链表
- C++学习笔记(四)指针实现的链表、堆栈、队列、二叉查找树
- C++ STL学习笔记四 list双向链表容器
- 【C++数据结构学习笔记---线性表】带头结点的双向循环链表
- 合并有序链表C++
- 数据结构学习---有序链表的合并
- [C++学习笔记]链表应用2约瑟夫环问题
- 【学习点滴-数据结构-单链表】单链表的建立,遍历及有序单链表合并
- c++ 将两个有序的单链表AB合并到新的单链表C中
- [C++学习笔记] 链表应用1判断一个集和是否为另一个集合的子集
- C/C++学习(八)两个有序链表归并为一个有序链表
- 《剑指Offer》学习笔记--面试题17:合并两个排序的链表
- leetcode_[python/C++]_21. Merge Two Sorted Lists(合并有序链表)
- 慕课网学习笔记之数据结构一单链表(C++)
- 学习笔记 C++ 链表
- C++实现两个有序链表合并(17)---《那些奇怪的算法》
- c++实现双向有序链表的,增,删,查,合并