LeetCode-Merge k Sorted Lists-合并k个排序链表-自底向上归并排序+链表操作

https://oj.leetcode.com/problems/merge-k-sorted-lists/

自底向上的归并排序,用一个step控制需要合并次数,每次都把相邻的两个表合并成一个大表存在第一个表原先所在的位置上。然后step扩大两倍。需要注意的是最后一个表如果i+step>n-1,则说明这个表只有一个。

另外链表操作时需要注意更新所有需要更新的指针,并且正确的更新头指针,这个很容易出错。

class Solution {
public:
	int n,m;
	vector<ListNode *> lists;
	void Merge(int a,int b){
		ListNode *h1=lists[a];
		ListNode *h2=lists[b];
		if (h1==NULL){
			lists[a]=h2;
			return;
		}
		if (h1==h2){
			return;
		}
		ListNode *p,*q,*lp,*h;
		lp=NULL;
		p=h1;
		q=h2;
		h=h1;
		while(q!=NULL && p!=NULL){
			if (p->val>q->val){
				if (lp!=NULL) {
					lp->next=q;
				}
				else{
					h=q;
				}
				ListNode *qq=q;
				q=q->next;
				qq->next=p;
				lp=qq;
				continue;
			}
			if (lp==NULL){
				h=p;
			}
			lp=p;
			p=p->next;
		}
		if (p==NULL) lp->next=q;
		lists[a]=h;
	}
	ListNode *mergeKLists(vector<ListNode *> &lists) {
		n=lists.size();
		if (n==0){return NULL;}
		this->lists=lists;
		int step=2;
		while(step<=2*(n-1)){
			for (int i=0;i<n;i+=step){
				int b=i+step/2;
				if (b>=n){
					break;
				}
				Merge(i,b);
			}
			step*=2;
		}
		return this->lists[0];
	}
};

  

posted @ 2014-10-08 16:35  zombies  阅读(151)  评论(0编辑  收藏  举报