zoukankan      html  css  js  c++  java
  • 《剑指offer》 合并两个排序的链表

    本题来自《剑指offer》 合并两个排序的链表

    题目:

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

    思路:

       A:采用递归的方式(C++ Code)

        在各链不为空的情况下,比较各头结点的大小,将其作为头结点,之后递归调用。

      B:采用循环的方式(Python Code)

        需要考虑较为多的因素,代码的鲁棒性是否为空或者只有一个节点。

    C++ Code:(递归)

    /*
    struct ListNode {
        int val;
        struct ListNode *next;
        ListNode(int x) :
                val(x), next(NULL) {
        }
    };*/
    class Solution {
    public:
        ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
        {
            if (!pHead1){                                        //如果1为空,则直接返回2
                return pHead2;
            }else if(!pHead2){                                   //如果2为空,则直接返回1
                return pHead1;
            }
            ListNode* MergeNode = NULL;
            if (pHead1->val < pHead2->val){                      //如果第一个链的头结点小于第二个
                MergeNode = pHead1;                              //则合并的头结点为第一个的头结点
                MergeNode->next = Merge(pHead1->next,pHead2);    //递归调用下个
            }else{
                MergeNode = pHead2;                              //如果第一个链大于或者等于第二的头结点
                MergeNode->next = Merge(pHead1,pHead2->next);    //则递归调用
            }
            return MergeNode;                                    //最终返回合并的头结点
        }
    };

    Python Code:(循环方式)

    # -*- coding:utf-8 -*-
    # class ListNode:
    #     def __init__(self, x):
    #         self.val = x
    #         self.next = None
    class Solution:
        # 返回合并后列表
        def Merge(self, pHead1, pHead2):
            # write code here
            if pHead1 == None:                #如果1链的头结点为空,则直接返回2
                return pHead2
            if pHead2 == None:                #如果2链的头结点为空,则直接返回1
                return pHead1
            '''
            首先处理头部分,将两个值的最小作为结果链表的头
            '''
            if pHead1.val < pHead2.val:       #如果1的头结点值小于2头结点的值
                head = pHead1                 #合并链的头结点是1的头结点
                pHead1 = pHead1.next          #则将节点后移
            else:
                head = pHead2                 #否则为2为头结点(大于或者等于)
                pHead2 = pHead2.next
            temp = head                       #临时变量,为保存下一个节点
            '''
            其次处理链表只有一个节点的情况,在上面步骤后将那个大的节点挂载到后面的节点中
            '''
            if pHead1 == None :
                temp.next = pHead2
            if pHead2 == None:
                temp.next = pHead1
            while pHead1 and pHead2:          #这种情况在各个链表的节点多余两个以上时,并且不为空
                if pHead1.val < pHead2.val:   #同理将各个链表的头结点分别比较挂载到结果节点的子节点
                    temp.next = pHead1
                    pHead1 = pHead1.next
                else:
                    temp.next = pHead2
                    pHead2 = pHead2.next
                temp = temp.next
                if pHead1 == None:            #如果比较出现结束,将未完的第二个节点挂载到结果节点上
                    temp.next = pHead2
                    break
                if pHead2 == None:
                    temp.next = pHead1
                    break
            return head                       #最终返回子节

    总结:

  • 相关阅读:
    MyBatis学习(五)resultMap测试
    MyBatis学习(四)XML配置文件之SQL映射的XML文件
    Mybatis学习(三)XML配置文件之mybatis-config.xml
    每次回顾,总会有一点小收获!
    php数组去重、魔术方法、redis常用数据结构及应用场景
    MySQL使用可重复读作为默认隔离级别的原因
    后端程序猿标配之linux命令
    常用字符串函数
    nginx配置隐藏index.php
    MySQL的sql_mode解析与设置
  • 原文地址:https://www.cnblogs.com/missidiot/p/10783595.html
Copyright © 2011-2022 走看看