剑指offer 面试题25 合并两个排序的链表

本文详细介绍了如何将两个升序排列的链表合并为一个保持升序的新链表,通过迭代和递归两种方法实现,特别强调了在链表尾部插入较小元素的策略,以确保合并后链表的有序性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

类似于归并排序的归并过程,思路是每次在链表的尾部插入较小的元素。
也可以考虑用递归的方法写,比较简便。

#include <iostream>
#include <string>
#include <memory>
#include <vector>
#include<cmath>
#include<stack>
#include<algorithm>
using namespace std;

struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) :
			val(x), next(NULL) {
	}
};

class Solution {
public:
    ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
    {
        ListNode* res;
        ListNode* tail=new ListNode(-1);
        res=tail;
        while (pHead1!=NULL&&pHead2!=NULL)
        {
            if(pHead1->val<pHead2->val) {
                ListNode* temp=new ListNode(pHead1->val);
                pHead1=pHead1->next;
                tail->next=temp;
                tail=tail->next;
            } else {
                ListNode* temp=new ListNode(pHead2->val);
                pHead2=pHead2->next;
                tail->next=temp;
                tail=tail->next;
            }
        }
        if(pHead1!=NULL) {
            tail->next=pHead1;
        }
        if(pHead2!=NULL) {
            tail->next=pHead2;
        }
        return res->next;
    }
};

int main() {
    Solution sol;
    ListNode* test1=new ListNode(2);
    test1->next=new ListNode(4);
    ListNode* test2=new ListNode(1);
    test2->next=new ListNode(3);
    ListNode* res=sol.Merge(test1,NULL);

    system("pause");
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值