数据结构-合并链表

题目:将两个递增的有序链表合并为一个递增的有序链表。要求结果链表仍使用原来两个链表的存储空间,不另外占用其他的存储空间。表中不允许有重复的数据。
算法思想:两个有序表和目标表都是有序且递增的,可以通过修改各个结点的指针域来重建新的元素之间的线性关系,即可完成此题。

画个图看看就好理解了:
数据结构-合并链表_第1张图片
其实就是力扣上的第21题
数据结构-合并链表_第2张图片
用c语言写:

//将两个递增的有序链表La和Lb合并为一个递增的有序链表Lc
void MergeList(LinkList &La, LinkList &Lb, LinkList &Lc) {
	pa = La -> next ;
	pb = Lb -> next ;

	Lc = pc = La ; //用La的头结点作为Lc的头结点

	while (pa && pb) {
		if (pa->data < pb->data) {
			//取较小者La中的元素,将pa链接在pc,pa指针后移
			pc -> next = pa ;
			pc = pa ;
			pa = pa -> next ;
		} else if (pa->data < pb->data) {
			//取较小者Lb中的元素,将pb链接在pc,pb指针后移
			pc -> next = pa ;
			pc = pa ;
			pa = pa -> next ;
		} else {
			//相等时取La中的元素,删除Lb中的元素
			pc -> next = pa ;
			pc = pa ;
			pa = pa -> next ;

			q = pb -> next ;
			delete pb ;
			pb = q ;
		}
	}
	pc -> next = pa ? pa : pb ;//将非空表的剩余元素直接连接在Lc表的最后
	delete Lb ;//释放Lb的头结点
}

你可能感兴趣的:(链表,数据结构,算法)