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

本文介绍了一种使用自底向上归并排序的方法来解决LeetCode上合并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];
	}
};

  

转载于:https://www.cnblogs.com/yangsc/p/4011511.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值