剑指offer题目16:合并两个排序的链表

题目描述

给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。

解答思路

问题不难,就是实现起来比较麻烦,要注意鲁棒性,要注意两点:

  1. 当输入的时候也是空链表
  2. 某一个链表迭代完成后的话,如果另一个链表还有数据该怎么处理。

ps:这题目如果用递归会很快实现且代码简洁,就是总感觉递归容易爆内存。。而且那个取最小值的操作,我一开始想着指针指向的值会跟着p=p->next一起改变,没想到不会,卡了一会儿。。因为以往的是复制形参的指针地址,修改了地址指向的值,当然值也会改,这次我想修改的是指针本身的值,所以要加引用。

实现代码

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
            val(x), next(NULL) {
    }
};*/
class Solution {
public:
    ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
    {
        ListNode* mergeHead = NULL;
        ListNode* tempNode;
        ListNode* current;

        int i = 0;
        while(pHead1 || pHead2) {
            
            int temp = GetSmallNode(pHead1, pHead2);
            tempNode = new ListNode(temp);

            if(!i) {
                mergeHead = tempNode;
                current = mergeHead;
            } else {
                current->next = tempNode;
                current = current->next;
            }

            i++;
        }
        
        return mergeHead;
    }

    // 获取两个链表最大的值,因为是要修改指针本身,所以需要加引用或者指针的指针
    int GetSmallNode(ListNode* &pHead1, ListNode* &pHead2) {
        ListNode* current;

        if(pHead1 == NULL){
            current = pHead2;
            pHead2 = pHead2->next;
        } else {
            if(pHead2 == NULL){
                current = pHead1;
                pHead1 = pHead1->next;
            }
            else {
                if(pHead1->val > pHead2->val) {
                    current = pHead2;
                    pHead2 = pHead2->next;
                } else {
                    current = pHead1;
                    pHead1 = pHead1->next;
                }
            }
        }

        return current->val;
    }
};
posted @ 2019-04-01 11:51  {-)大傻逼  阅读(121)  评论(0)    收藏  举报
欢迎转载,转载请注明本文地址。