LeetCode Easy|【21. 合并两个有序链表】

力扣题目链接

状态:拿到本题的第一反应就是使用双指针,分别指向两个链表的开头位置。

随后的思路就是以第一条链表为基准完成插入,并且对于遍历到的每个节点都应该保存其状态。

写了一下代码后发现,我们应该以第一个节点较小的链表作为基准链表。

随后就是开始我们的遍历操作了。

cpp 复制代码
class Solution {
public:
    ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
    	// 其中一个链表为空,直接返回另一个链表
        if (!list1) return list2;
        if (!list2) return list1;
		
		// 确定基准链表
        ListNode* head = nullptr;
        if (list1->val <= list2->val) {
            head = list1;
            list1 = list1->next;
        } else {
            head = list2;
            list2 = list2->next;
        }
		
		// 当前操作指针指向基准链表的头节点
        ListNode* current = head;
	
		// 使用双指针来遍历两个链表
        while(list1 && list2) {
            if (list1->val <= list2->val) {
                current->next = list1;
                list1 = list1->next;
            } else {
                current->next = list2;
                list2 = list2->next;
            }
            current = current->next;
        }
		
		// 最后链接剩余的链表
        if (list1) {
            current->next = list1;
        } else {
            current->next = list2;
        }

        return head;
    }
};

当然了还有一种更加简单的思路,其实思路上主体都是一致的,不过代码上会简单很多,但是他会有一个额外的空间来申请一个新的链表。

cpp 复制代码
class Solution {
public:
    ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
        // 创建一个虚拟头节点
        ListNode dummy(0);
        ListNode* current = &dummy;

        // 使用双指针遍历两个链表
        while (list1 != nullptr && list2 != nullptr) {
            if (list1->val <= list2->val) {
                current->next = list1;
                list1 = list1->next;
            } else {
                current->next = list2;
                list2 = list2->next;
            }
            current = current->next;
        }

        // 连接剩余的链表
        if (list1 != nullptr) {
            current->next = list1;
        } else {
            current->next = list2;
        }

        return dummy.next;
    }
};
相关推荐
m0_71354184几秒前
systemverilog如何解决不能使用变量索引来进行位选择的范围指定
算法·systemverilog
七牛云行业应用26 分钟前
深度解析强化学习(RL):原理、算法与金融应用
人工智能·算法·金融
和编程干到底29 分钟前
数据结构 栈和队列、树
数据结构·算法
纪元A梦31 分钟前
贪心算法在GNN邻域采样问题中的深度解析
算法·贪心算法
宇钶宇夕33 分钟前
西门子 S7-200 SMART PLC 核心指令详解:从移位、上升沿和比较指令到流水灯控制程序实战
运维·算法·自动化
爱编程的化学家1 小时前
代码随想录算法训练营第十一天--二叉树2 || 226.翻转二叉树 / 101.对称二叉树 / 104.二叉树的最大深度 / 111.二叉树的最小深度
数据结构·c++·算法·leetcode·二叉树·代码随想录
tqs_123451 小时前
redis zset 处理大规模数据分页
java·算法·哈希算法
吃着火锅x唱着歌2 小时前
LeetCode 1446.连续字符
算法·leetcode·职场和发展
愚润求学2 小时前
【贪心算法】day10
c++·算法·leetcode·贪心算法
吴秋霖2 小时前
主流反爬虫、反作弊防护与风控对抗手段
爬虫·算法·反爬虫技术