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;
    }
};
相关推荐
Zedthm4 分钟前
LeetCode1004. 最大连续1的个数 III
java·算法·leetcode
神的孩子都在歌唱24 分钟前
3423. 循环数组中相邻元素的最大差值 — day97
java·数据结构·算法
YuTaoShao29 分钟前
【LeetCode 热题 100】73. 矩阵置零——(解法一)空间复杂度 O(M + N)
算法·leetcode·矩阵
dying_man1 小时前
LeetCode--42.接雨水
算法·leetcode
vortex52 小时前
算法设计与分析 知识总结
算法
艾莉丝努力练剑2 小时前
【C语言】学习过程教训与经验杂谈:思想准备、知识回顾(三)
c语言·开发语言·数据结构·学习·算法
ZZZS05162 小时前
stack栈练习
c++·笔记·学习·算法·动态规划
黑听人2 小时前
【力扣 困难 C】115. 不同的子序列
c语言·leetcode
hans汉斯3 小时前
【人工智能与机器人研究】基于力传感器坐标系预标定的重力补偿算法
人工智能·算法·机器人·信号处理·深度神经网络
vortex54 小时前
算法设计与分析:分治、动态规划与贪心算法的异同与选择
算法·贪心算法·动态规划