题解 | #链表中的节点每k个一组翻转#
合并k个已排序的链表
http://www.nowcoder.com/practice/65cfde9e5b9b4cf2b6bafa5f3ef33fa6
```/**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*
* C语言声明定义全局变量请加上static,防止重复定义
*/
/**
*
* @param lists ListNode类一维数组
* @param listsLen int lists数组长度
* @return ListNode类
* Divide and Conquer
* 0 1 2 3 4 5 6 7 8;
* (0,1) (2,3) (4,5) (6,7) 8; divide;
* (0,1)->10 (2,3)->23 (4,5)->45 (6,7)->67 8->8;conquer;critical:0 1 return 10;
* 10 23 45 67 8 divide
* (10,23) (45,67) 8
* (10,23)->1023 (45,67)->4567 8->8;conquer;
* 1023 4567 8;
* (1023,4567) 8 ;divide;
* (1023,4567)->10234567 8->8 conquer
* (10234567,8) divide;
* (10234567,8)->102345678;
* finished;
*/
struct ListNode* merge2(struct ListNode* p, struct ListNode *q ) { // Conquer
struct ListNode *head, *tool, *headtrave, *Trav1, *Trav2;
Trav1 = p;
head = NULL;
headtrave = head;
Trav2 = q;
if(Trav1 == NULL && Trav2 == NULL) return NULL;
if(Trav1 != NULL && Trav2 == NULL) return Trav1;
if(Trav1 == NULL && Trav2 != NULL) return Trav2;
while(Trav1 && Trav2) {
if(Trav1->val >= Trav2->val) {
if(headtrave == NULL) {
headtrave = Trav2;
head = Trav2;
Trav2 = Trav2->next;
head->next = NULL;
} else {
tool = Trav2;
Trav2 = Trav2->next;
tool->next = headtrave->next;
headtrave->next = tool;
headtrave = tool;
}
} else {
if(headtrave == NULL) {
headtrave = Trav1;
head = Trav1;
Trav1 = Trav1->next;
head->next = NULL;
} else {
tool = Trav1;
Trav1 = Trav1->next;
tool->next = headtrave->next;
headtrave->next = tool;
headtrave = tool;
}
}
}
headtrave->next = Trav1?Trav1:Trav2;
return head;
}
struct ListNode* merge(struct ListNode** lists, int Left, int Right) { // Divide;
if(Left > Right) {
return NULL;
}
if(Left == Right) {
return lists[Left];
}
int Mid = (Left+Right)/2;
return merge2(merge(lists, Left, Mid), merge(lists, Mid+1, Right));
}
struct ListNode* mergeKLists(struct ListNode** lists, int listsLen ) {
// write code here
if(listsLen == 0) {return NULL;}
if(listsLen == 1) {return lists[0];}
return merge(lists,0,listsLen-1);
}