25 合并两个排序的链表(第3章 高质量的代码-代码的鲁棒性)

题目描述:

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

测试用例:  

1)功能测试(输入的两个链表有多个节点;节点的值互不相同或者存在值相等的多个节点)

2)特殊输入测试(连个链表的一个或者两个头节点为nullptr指针;两个链表中只有一个节点)为什么单独列出来,哪里特殊??

解题思路:

1)将两个链表的值按大小存入到队列queue中,然后按照队列的值重新生成一个新的链表。

class Solution {
public:
    ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
    {
        //处理特殊输入
        if(pHead1==nullptr)return pHead2;
        if(pHead2==nullptr)return pHead1;
        //为每个链表定义一个访问指针
        ListNode* pCurrent1=pHead1;
        ListNode* pCurrent2=pHead2;
        //新链表的头节点
        ListNode* newpHead=new ListNode(-1);
        //定义队列用于存储链表的所有节点的值(排序好的)
        queue<int> saveValues;

        while( pCurrent1!=nullptr && pCurrent2!=nullptr){
            if(pCurrent1->val <= pCurrent2->val){
                saveValues.push(pCurrent1->val);
                pCurrent1 = pCurrent1->next;
            }else{
                saveValues.push(pCurrent2->val);
                pCurrent2 = pCurrent2->next;
            }
        }
        //将剩余链表的值直接读入
        ListNode* nullFlag = nullptr;
        if(pCurrent1==nullptr)
            nullFlag = pCurrent2;
        else
            nullFlag = pCurrent1;

        while(nullFlag != nullptr){
            saveValues.push(nullFlag->val);
            nullFlag = nullFlag->next;
        }
        //建立新的链表
        ListNode* pNode = newpHead;
        while(!saveValues.empty()){
            ListNode* pnewNode=new ListNode(-1);
            pnewNode->val=saveValues.front();
            saveValues.pop();
            pNode->next = pnewNode;
            pNode = pNode->next;
        }

        return newpHead->next;
    }
};

2)使用递归方法:

//实现1class Solution {
public:
    ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
    {
        if(pHead1==nullptr)return pHead2;
        if(pHead2==nullptr)return pHead1;

        if(pHead1->val <= pHead2->val){ //则头节点为pHead1
            pHead1->next = Merge(pHead1->next, pHead2);
            return pHead1;
        }else{  //则头节点为pHead2
            pHead2->next = Merge(pHead1, pHead2->next);
            return pHead2;
        }
    }
};
//实现2
class Solution {
public:
    ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
    {
        if(pHead1==nullptr)return pHead2;
        if(pHead2==nullptr)return pHead1;

        ListNode* pMergedHead = nullptr;

        if(pHead1->val <= pHead2->val){ //则头节点为pHead1
            pMergedHead = pHead1;
            pMergedHead->next = Merge(pHead1->next, pHead2);
        }else{
            pMergedHead = pHead2;
            pMergedHead->next = Merge(pHead1, pHead2->next);
        }
        return pMergedHead;
    }
};

  

  

  

原文地址:https://www.cnblogs.com/GuoXinxin/p/10449521.html

时间: 2024-11-05 01:02:07

25 合并两个排序的链表(第3章 高质量的代码-代码的鲁棒性)的相关文章

剑指Offer:合并两个排序的链表【25】

剑指Offer:合并两个排序的链表[25] 题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 题目分析 每次都是比较箭头节点,把小节点连接到已经合并的链表之后,重复的执行此过程,最后如果那个链表已经走完,那就将另一个链表直接连接到合并的链表之后. Java题解 public static ListNode Merge(ListNode list1,ListNode list2) { if(list1==null) return list2;

面试题17:合并两个排序的链表

ListNode类(结点类) 1 package leetcode.utilities; 2 3 public class ListNode { 4 public int val ; 5 public ListNode next ; 6 public ListNode(int val) { 7 // TODO Auto-generated constructor stub 8 this.val = val; 9 this.next = null ; 10 } 11 //打印链表 12 publi

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

题目:输入两个递增排序的链表,合并这两个链表并使新链表中的节点人是按照递增排序的.解题思路:两个链表分别都已经是有序的了,遍历链表的时候只要比较两个链表当前位置大小,取出最小的添加到新链表中. 可以有递归.循环两种方式来解决. 1 package Solution; 2 3 4 public class No17MergeSortedLists { 5 6 public static class ListNode { 7 int data; 8 ListNode next; 9 10 publi

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

题目1519:合并两个排序的链表 题目描述: 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则.(hint: 请务必使用链表.) 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入的第一行为两个整数n和m(0<=n<=1000, 0<=m<=1000):n代表将要输入的第一个链表的元素的个数,m代表将要输入的第二个链表的元素的个数.下面一行包括n个数t(1<=t<=1000000):代表链表一中的元素.接

剑指Offer对答如流系列 - 合并两个排序的链表

面试题25:合并两个排序的链表 题目描述 输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的. 链表结构: public class ListNode { int val; ListNode next=null; ListNode(int val){ this.val=val; } } 问题分析 这道面试题,太常见了!!! 不难,但是容易出错.一方面是合并过程链表中间断裂或者没有做到递增,另一方面是代码的鲁棒性不行,也就是忽略了特殊测试(比如任意一个或者两个链表的头结点

面试题 17:合并两个排序的链表

题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按 照递增排序的. 两个指针指向两个链表的头结点,取其中值小的作为新链表的头结点,和之前的结点串联,如此递归. 注意用例: 两个链表都为null: 其中一个链表为null: 两个链表有多个结点,有相同的值,不同的值. package offer; /*面试题 17:合并两个排序的链表 题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按 照递增排序的.*/ public class Problem17 { st

合并两个排序的链表(剑指offer)

合并两个排序的链表 参与人数:1527时间限制:1秒空间限制:32768K 通过比例:27.96% 最佳记录:0 ms|8552K(来自  牛客708854号) 题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 题目链接:http://www.nowcoder.com/practice/d8b6b4358f774294a89de2a6ac4d9337?rp=1&ru=/ta/coding-interviews&qru=/ta/codin

面试题:合并两个排序的链表

题目:输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增的. 例如: /*合并两个排序的链表*/ /* 链表节点定义如下: struct ListNode { int _data; ListNode* _next; }; */ ListNode* MergeList(ListNode* pHead1, ListNode* pHead2) { if (pHead1 == NULL) //链表1为空链表 { return pHead2; } else if (pHead2 == NU

剑指offer_面试题17_合并两个排序的链表(两种思维)

题目:输入两个递增排序的链表,合并这两个链表,并使新链表中的结点仍然是按照递增排序的. 第一种思维:合并两个排序的链表,类似于合并两个排序数组,所不同的仅是一个用链表保存数据,一个用数组保存数据. 算法如下:(下面的算法前提是:头结点 不是 链表的第一个数据节点.) /**方法一:合并两个排序链表,使用了新创建的链表来保存,没有改动两个原始链表*/ ListNode *merge_tow_list(ListNode *pHead1,ListNode *pHead2) { if(NULL == p