当前位置:   article > 正文

合并两个有序链表(三种方法)---C++实现_合并两个有序链表c++代码

合并两个有序链表c++代码

方法一:若要求不能对原始链表更改,则必须使用额外空间

//使用额外空间来合并链表 不对原始链表做改变
node* mergeTwoLinkListWithExtraPlace(node *head1, node *head2) {
	/*先创建一个头结点 这里用任意的整数都可以 不一定用0 之后返回newHead->next
	即可 该方法在很多时候都可以起到简化代码的作用 值得借鉴*/
	node *newHead = new node(0);
	node *tail = newHead; //记录尾节点 方便尾插法
	node *p = head1;
	node *q = head2;
	while (p && q) {
		if (p->data < q->data) {
			node *r = new node(p->data);
			p = p->next;
			tail->next = r;
		}
		else {
			node *r = new node(q->data);
			q = q->next;
			tail->next = r;
		}
		tail = tail->next;
	}
	//如果有一个链表到达了尾部
	while (p) {
		node *r = new node(p->data);
		tail->next = r;
		tail = tail->next;
		p = p->next;
	}
	while (q) {
		node *r = new node(q->data);
		tail->next = r;
		tail = tail->next;
		q = q->next;
	}
	return newHead->next; //这里头结点直接丢弃 保证完整性 可以释放头结点 如下
	/*node *r = newHead;
	newHead = newHead->next;
	delete r;
	r = nullptr;
	return newHead;*/
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41

方法二:更改原始链表 主要利用循环实现

//非递归的方式 也成迭代法
node* mergeTwoSortedLinkListWithoutRecursion(node* head1, node* head2) {
	node* newHead = new node(0); //先创建一个链表头结点 返回的时候返回头结点下一个结点即可
	node *p = head1;
	node *q = head2;
	node* tail = newHead; //这个结点用来记录合并后链表的尾节点 方便进行尾插法
	while (p && q) {
		if (p->data < q->data) {
			tail->next = p;
			p = p->next;
		}
		else {
			tail->next = q;
			q = q->next;
		}
		tail = tail->next;
	}
	//以下情况是有一个链表走到了尾部
	if (p) {
		tail->next = p;
	}
	if (q) {
		tail->next = q;
	}
	return newHead->next;  //这里头结点最好释放一下 如下
	/*node *r = newHead;
	newHead = newHead->next;
	delete r;
	r = nullptr;
	return newHead;*/
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

方法三:一般绝大多数链表和树的题目都可以用递归实现,注意递归出口条件

node* mergeTwoSortedLinkListWithRecursion(node* head1, node* head2) {
	//如果head1 和 head2有一个为空 则直接返回另一个
	if (!head1) {
		return head2;
	}
	if (!head2) {
		return head1;
	}
	//递归可以理解为之后的情况都处理好了 只需要解决好当前这步就行了
	if (head1->data < head2->data) {
		head1->next = mergeTwoSortedLinkListWithRecursion(head1->next, head2);
		return head1;
	}
	else {
		head2->next = mergeTwoSortedLinkListWithRecursion(head1, head2->next);
		return head2;
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/bf789/article/detail/62962
推荐阅读
相关标签
  

闽ICP备14008679号