【剑指Offer | C++ 】面试题25:合并两个排序的链表 (双指针法 | 递归法)

24 篇文章 0 订阅
24 篇文章 0 订阅

题目: 输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是依照递增排序的。

解法:

  1. 双指针法:
    用两个指针指向两个链表不断比较大小并连接,
    需要记录返回合并后链表的当前节点,比较麻烦

  2. 递归法
    每次判断头节点(值小的),和尾部合并好的节点(明显的递归特诊)

递归代码:

#include "pch.h"
#include<iostream>
using namespace std;

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


ListNode* MergeSortedList(ListNode* node1,ListNode* node2) {

    if (node1 == nullptr) return node2;
    if (node2 == nullptr) return node1;

    ListNode* res;
    if (node1->value <= node2->value)  res = node1;
    else  res = node2;

    res->next = MergeSortedList(res->next, node1 == res ? node2 : node1);
    return res;
    
}

int main()
{
    ListNode* p1 = new ListNode();
    p1->value = 4;
    p1->next = nullptr;
    ListNode* p2 = new ListNode();
    p2->value = 2;
    p2->next = p1;
    ListNode* p3 = new ListNode();
    p3->value = 3;
    //p3->next = p2;
    ListNode* p4 = new ListNode();
    p4->value = 1;
    p4->next = p3;


    ListNode* t = MergeSortedList(p4,p2);
    cout << t->value;


}

7行代码解决

防御性:

  • 一个或两个空链表输入
  • 链表有环(有可能需要考虑的点)
    如果题目说不包含环的就无需考虑
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赛文X

觉得不错就打赏下呗mua~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值