题目分析:
- 合并k个已经排好序的链表为一个有序链表。
解题思路:
递归实现
利用递归思想,依次两两合并一个有序链表,直到合并为一个链表为止。
实现程序
//合并两个有序单链表 ListNode *mergeTwoLists(ListNode *l1, ListNode *l2) { ListNode *head = (ListNode *)malloc(sizeof(ListNode)); head->val = -1; head->next = NULL; ListNode *temp = head; ListNode *p = l1, *q = l2; while(p != NULL && q != NULL) // 遍历两个链表进行合并 { if (p->val <= q->val) { temp->next = p; temp = temp->next; p = p->next; } else if (p->val > q->val) { temp->next = q; temp = temp->next; q = q->next; } } if (p != NULL) { temp->next = p; } else if (q != NULL) { temp->next = q; } return head->next; } //合并k个有序的单链表 ListNode *mergeKLists(vector<ListNode *> &lists) { if (lists.size() == 0) // 处理特殊情况 return NULL; if (lists.size() == 1) return lists[0]; vector<ListNode *> newLists; int start = 0; if (lists.size() % 2 != 0) // 处理链表为奇数情况 { newLists.push_back(lists[0]); start++; } for (int i = start; i < lists.size(); i += 2) // 两两合并链表 { ListNode *temp = mergeTwoLists(lists[i], lists[i + 1]); newLists.push_back(temp); } return mergeKLists(newLists); // 递归进行合并 }