【每日算法】AB11 合并两个排序的链表

简介: 【每日算法】AB11 合并两个排序的链表

一、题目

描述

输入两个递增的链表,单个链表的长度为n,合并这两个链表并使新链表中的节点仍然是递增排序的。
数据范围: 0≤n≤1000,-1000≤节点值≤1000
要求:空间复杂度 O(1)O(1),时间复杂度 O(n)O(n)

如输入{1,3,5},{2,4,6}时,合并后的链表为{1,2,3,4,5,6},所以对应的输出为{1,2,3,4,5,6},转换过程如下图所示:
image.png

二、代码

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

/**
 *
 * @param pHead1 ListNode类
 * @param pHead2 ListNode类
 * @return ListNode类
 */
struct ListNode* Merge(struct ListNode* pHead1, struct ListNode* pHead2 ) {
    if (pHead1 == NULL) {
        return pHead2;
    } else if (pHead2 == NULL) {
        return pHead1;
    } else {
        struct ListNode* p1 = pHead1;
        struct ListNode* p2 = pHead2;
        struct ListNode* pHead3 = (struct ListNode*)malloc(sizeof(struct ListNode));
        pHead3->next = NULL;
        if (p1->val >= p2->val) {
            pHead3->val = p2->val;
            p2 = p2->next;
        } else {
            pHead3->val = p1->val;
            p1 = p1->next;
        }
        struct ListNode* p3 = pHead3;
        while (1) {
            if (p1 == NULL && p2 == NULL) {
                break;
            }
            struct ListNode* new_n = (struct ListNode*)malloc(sizeof(struct ListNode));
            if (p1 == NULL) {
                new_n->val = p2->val;
                new_n->next = NULL;
                p3->next = new_n;
                p2 = p2->next;
                p3 = new_n;
            } else if (p2 == NULL) {
                new_n->val = p1->val;
                new_n->next = NULL;
                p3->next = new_n;
                p1 = p1->next;
                p3 = new_n;
            } else {
                if (p1->val >= p2->val) {
                    new_n->val = p2->val;
                    new_n->next = NULL;
                    p3->next = new_n;
                    p2 = p2->next;
                    p3 = new_n;
                } else {
                    new_n->val = p1->val;
                    new_n->next = NULL;
                    p3->next = new_n;
                    p1 = p1->next;
                    p3 = new_n;
                }
            }
        }
        return pHead3;
    }
}

三、总结

第一次测的时候有六个用例没过,报段错误,推测是指针的非法读,后来发现,写的时候为了省事,把37-63行合并起来写了(如下),因为当p1或者p1->val >= p2->val 时,执行语句都是一样的

                if (p1 == NULL || p1->val >= p2->val) {
                    new_n->val = p2->val;
                    new_n->next = NULL;
                    p3->next = new_n;
                    p2 = p2->next;
                    p3 = new_n;
                } else {
                    new_n->val = p1->val;
                    new_n->next = NULL;
                    p3->next = new_n;
                    p1 = p1->next;
                    p3 = new_n;
                }

在如上第一行判断语句中,当p1不为空时,会继续比较p1->val 和 p2->val,如果此时p2为空,那么p2->val就是一个非法读,会引发段错误

目录
相关文章
|
1月前
|
算法
【算法】二分查找——在排序数组中查找元素的第一个和最后一个位置
【算法】二分查找——在排序数组中查找元素的第一个和最后一个位置
|
1月前
|
存储 算法
LeetCode第83题删除排序链表中的重复元素
文章介绍了LeetCode第83题"删除排序链表中的重复元素"的解法,使用双指针技术在原链表上原地删除重复元素,提供了一种时间和空间效率都较高的解决方案。
LeetCode第83题删除排序链表中的重复元素
|
1月前
|
搜索推荐 算法 Java
现有一个接口DataOperation定义了排序方法sort(int[])和查找方法search(int[],int),已知类QuickSort的quickSort(int[])方法实现了快速排序算法
该博客文章通过UML类图和Java源码示例,展示了如何使用适配器模式将QuickSort类和BinarySearch类的排序和查找功能适配到DataOperation接口中,实现算法的解耦和复用。
20 1
现有一个接口DataOperation定义了排序方法sort(int[])和查找方法search(int[],int),已知类QuickSort的quickSort(int[])方法实现了快速排序算法
|
1月前
|
算法 搜索推荐 Java
算法实战:手写归并排序,让复杂排序变简单!
归并排序是一种基于“分治法”的经典算法,通过递归分割和合并数组,实现O(n log n)的高效排序。本文将通过Java手写代码,详细讲解归并排序的原理及实现,帮助你快速掌握这一实用算法。
38 0
|
1月前
|
算法
【算法】合并两个有序链表(easy)——递归算法
【算法】合并两个有序链表(easy)——递归算法
【算法】合并两个有序链表(easy)——递归算法
|
1月前
|
算法 关系型数据库 MySQL
揭秘MySQL中的版本号排序:这个超级算法将颠覆你的排序世界!
【8月更文挑战第8天】在软件开发与数据管理中,正确排序版本号对软件更新及数据分析至关重要。因MySQL默认按字符串排序版本号,可能出现'1.20.0'在'1.10.0'之前的不合理情况。解决办法是将版本号各部分转换为整数后排序。例如,使用`SUBSTRING_INDEX`和`CAST`函数从`software`表的`version`字段提取并转换版本号,再按这些整数排序。这种方法可确保版本号按逻辑正确排序,适用于'major.minor.patch'格式的版本号。对于更复杂格式,需调整处理逻辑。掌握此技巧可有效应对版本号排序需求。
103 3
|
1月前
|
算法
【数据结构与算法】共享双向链表
【数据结构与算法】共享双向链表
12 0
|
1月前
|
算法
【数据结构与算法】双向链表
【数据结构与算法】双向链表
11 0
|
1月前
|
算法
【数据结构与算法】循环链表
【数据结构与算法】循环链表
13 0
|
1月前
|
存储 算法
【数据结构与算法】链表
【数据结构与算法】链表
17 0