3.16 合并两个排序的链表

输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。

方法一:(不开辟新的空间)

struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) :
		val(x), next(NULL) {
	}
};
class Solution {
public:
	ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
	{
		ListNode* head = NULL;
		do
		{
			if (NULL == pHead1) {
				head = pHead2;
				break;
			}
			if (NULL == pHead2) {
				head = pHead1;
				break;
			}
			ListNode* p = pHead1;
			ListNode* q = pHead2;
			ListNode* qPre = NULL;

			while (NULL != p && NULL != q) {
				if (p->val <= q->val) {
					ListNode* temp = p->next;
					p->next = q;
					q = p;
					if (qPre != NULL) {
						qPre->next = p;
						qPre = NULL;
					}
					p = temp;
				}
				else {
					if (NULL == q->next) {
						q->next = p;
						q = NULL;
					}
					else {
						qPre = q;
						q = q->next;
					}
				}
			}

			if (pHead1->val <= pHead2->val) {
				head = pHead1;
			}
			else {
				head = pHead2;
			}

		} while (0);

		return head;
	}
};
测试一:

在这里插入图片描述

方法二: (开辟新的空间)
	
/*
struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) :
			val(x), next(NULL) {
	}
};*/
class Solution {
public:
    ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
    {
        ListNode* head = NULL;
		do
		{
			if (NULL == pHead1) {
				head = pHead2;
				break;
			}
			if (NULL == pHead2) {
				head = pHead1;
				break;
			}
			ListNode* p = pHead1;
			ListNode* q = pHead2;
			ListNode* m = NULL;

			while (NULL != p && NULL != q) {
				if (p->val <= q->val) {
					if (m == NULL) {
						m = new ListNode(p->val);
						head = m;
					}
					else {
						m->next = new ListNode(p->val);
						m = m->next;
					}
					p = p->next;
				}
				else {
					if (m == NULL) {
						m = new ListNode(q->val);
						head = m;
					}
					else {
						m->next = new ListNode(q->val);
						m = m->next;
					}
					q = q->next;
				}
			}

			while (p != NULL) {
				m->next = new ListNode(p->val);
				p = p->next;
				m = m->next;
			}

			while (q != NULL) {
				m->next = new ListNode(q->val);
				q = q->next;
				m = m->next;
			}

		} while (0);

		return head;
    }
};
测试二:

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_37518595/article/details/84988473