合并两个有序链表

方法一:递归

/*
struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) :
			val(x), next(NULL) {
	}
};*/
class Solution {
public:
    ListNode* Merge(ListNode* pHead1, ListNode* pHead2) {
        if(pHead1 == NULL || pHead2 == NULL)
            return pHead1 != NULL ? pHead1 : pHead2;
        if(pHead1->val < pHead2->val){
            pHead1->next = Merge(pHead1->next, pHead2);
            return pHead1;
        }
        else{
            pHead2->next = Merge(pHead1, pHead2->next);
            return pHead2;
        }
    }
};

方法二:尾插

/*
struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) :
			val(x), next(NULL) {
	}
};*/
class Solution {
public:
    ListNode* Merge(ListNode* pHead1, ListNode* pHead2) {
        if(pHead1 == NULL || pHead2 == NULL)
           return pHead1 != NULL ? pHead1 : pHead2;
        ListNode* tmp = new ListNode(0);
        ListNode* newp =tmp;
        while(pHead1 && pHead2){
            if(pHead1->val < pHead2->val){
                tmp->next = pHead1;
                pHead1 = pHead1->next;
            }
            else{
                tmp->next = pHead2;
                pHead2 = pHead2->next;
            }
            tmp = tmp->next;
            if(pHead1)
                tmp->next = pHead1;
            if(pHead2)
                tmp->next = pHead2;
        }
        newp = newp->next;
        return newp;
    }
};

完整代码

#include <iostream>
using namespace std;

struct ListNode {
    int val;
    struct ListNode* next;
};

int main()
{
	ListNode *head1, *head2;
	head1 = new ListNode;//创建头结点1
	head2 = new ListNode;//创建头结点2
	head1->next = NULL;
	head2->next	= NULL;
	ListNode* p = head1;
	ListNode* q = head2;

	int input1;
	cout << "请输入链表1:" << endl;
	while(cin >> input1){
		ListNode* tmp = new ListNode;//申请临时指针空间
		tmp->val = input1;
		tmp->next = head1->next;
		head1->next = tmp;
		head1 = head1->next;
		
		if(cin.get() == '\n')
			break;
	}
	p = p->next;

	int input2;
	cout << "请输入链表2:" << endl;
	while(cin >> input2){
		ListNode* tmp = new ListNode;//申请临时指针空间
		tmp->val = input2;
		tmp->next = head2->next;
		head2->next = tmp;
		head2 = head2->next;
		
		if(cin.get() == '\n')
			break;
	}
	q = q->next;

	ListNode* r = new ListNode;//申请节点用于保存结果
	r->next = NULL;
	ListNode* res = r;

	if(p == NULL || q == NULL)//若其中有一个为空,返回另一个
		r->next = p == NULL ? q : p;
	else{
		while(p && q){
			if(p->val > q->val){
				r->next = q;
				q = q->next;
				r = r->next;
			}
			else{
				r->next = p;
				p = p->next;
				r = r->next;
			}
		}
		r->next = p == NULL ? q : p;//将两个链表中剩余的加在结果最后
	}
	res = res->next;

	while(res){
		cout << res->val << " ";
		res= res->next;
	}
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值