【小浩算法cpp题解】合并两个有序链表(21)

前言

今天继续做链表相关的题目,考研期间练多了现在觉得这种题目真是简单。晚上如果有机会可以再做一个树的深度优先搜索。

我的思路

其实这道题的思路比较像排序中的二路归并,最核心的点是在归并的时候要防止断链,我的解决方法是设置一个selected_node,除此之外还需要考虑的点在于我们是想生成一个新的链表,还是说把一个链表归并到另一个,两者的区别其实不大,前者需要重新创建结点罢了。

我的代码

#include<iostream>
#include <unordered_map>
#include<vector>
using namespace std;

typedef struct Lnode {
	int data;
	struct Lnode* next;
	Lnode(int val) :
		data(val), next(NULL) {
	}
};

class LinkedList {
private:
	Lnode* head;
	Lnode* rear;
	int node_num=0;

public:
	LinkedList(vector<int> data) : head(nullptr), rear(head) {
		int nodeData;
		//把链表的总长度存储在头结点的数据域
		head = new Lnode(node_num);
		Lnode* p = head;
		Lnode* q;
		for (int i = 0; i < data.size(); i++) {
			this->node_num++;
			q = new Lnode(data[i]);
			p->next = q;
			p = p->next;
		}
		p = head->next;
		//输出生成的链表
		cout << "您已经生成如下链表: " << endl;
		while (p->next != NULL) {
			cout << p->data << " -> ";
			p = p->next;
		}
		cout << p->data << endl;
		rear = p;
	}

	~LinkedList() {
		Lnode* current = head;
		while (current != rear->next && current != nullptr) {
			Lnode* next = current->next;
			delete current;
			current = next;
		}
	}

	void printList() {
		//输出生成的链表
		cout << "=============链表如下:====== " << endl;
		Lnode* p = head;
		while (p->next != NULL) {
			cout << p->data << " -> ";
			p = p->next;
		}
		cout << p->data << endl;
		rear = p;
	}

	void append(int val) {
		rear->next = new Lnode(val);
		rear = rear->next;
	}

	Lnode* mergeList(Lnode* LinkList1, Lnode* LinkList2) {
		Lnode *r=this->head;
		Lnode* p = LinkList1->next, * q = LinkList2->next, * selectNode = nullptr;
		while (p != nullptr && q != nullptr) {
			if (p->data <= q->data) {
				selectNode = p;
				p = p->next;
			}
			else {
				this->node_num++;
				selectNode = q;
				q = q->next;
			}
			r->next = selectNode;
			r = r->next;
		}
		if (p != nullptr) {
			selectNode->next = p;
		}
		if (q != nullptr) {
			selectNode->next = q;
		}
		return head->next;
	}

	Lnode* getLinkList() {
		return head;
	}
};

int main() {
	vector<int> v1 = { 2,3,8 };
	vector<int> v2 = { 1,4,7 };
	LinkedList Llist(v1);
	LinkedList Llist2(v2);
	Lnode* newList_Merged = Llist.mergeList(Llist.getLinkList(), Llist2.getLinkList());
	cout << "==================== " << endl;
	cout << "您已经生成如下链表: " << endl;
	Lnode* p = newList_Merged;
	while (p->next != NULL) {
		cout << p->data << " -> ";
		p = p->next;
	}
	cout << p->data << endl;
	Lnode* del;
	return 0;
}

相关推荐

  1. 算法cpp题解合并有序(21)

    2024-04-27 00:02:04       34 阅读
  2. Leetcode21 合并有序

    2024-04-27 00:02:04       66 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-27 00:02:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-27 00:02:04       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-27 00:02:04       82 阅读
  4. Python语言-面向对象

    2024-04-27 00:02:04       91 阅读

热门阅读

  1. nvm 错误

    2024-04-27 00:02:04       29 阅读
  2. 展开说说:Android动画使用

    2024-04-27 00:02:04       26 阅读
  3. 什么是裸金属服务器?

    2024-04-27 00:02:04       35 阅读
  4. 原型模式(上机考试抽题)

    2024-04-27 00:02:04       31 阅读
  5. 01_numpy

    2024-04-27 00:02:04       36 阅读
  6. 使用 LLaMA Factory 微调 Llama-3 中文对话模型

    2024-04-27 00:02:04       34 阅读
  7. class092 贪心经典题目专题4【左程云算法】

    2024-04-27 00:02:04       36 阅读
  8. Oracle基础1

    2024-04-27 00:02:04       25 阅读
  9. tcp通信协议

    2024-04-27 00:02:04       28 阅读
  10. 日志处理初探-日志存储

    2024-04-27 00:02:04       28 阅读
  11. 【SAP ME 12】SAP NWDS(eclipse)下载、安装,配置

    2024-04-27 00:02:04       22 阅读
  12. SQL查询一页数据过多太慢

    2024-04-27 00:02:04       37 阅读
  13. 【C++】33 搜索旋转排序数组

    2024-04-27 00:02:04       32 阅读