【每日一题-1】有序链表合并与累加和问题

来源:互联网 发布:navicat连接rds数据库 编辑:程序博客网 时间:2024/06/16 23:48

基础题——合并两个有序链表,合并以后的链表依旧有序。

思路:

(1)特殊情况处理:若两个链表都为则返回空,若其中一个链表为空返回另外一个链表的头结点;

(2)比较两个排序链表的头结点中的值,若L1<L2则新链表的头结点为L2,否则新链表的头结点为L1;

(3)将赋值给新链表的链表的头结点向后移动,然后继续执行(2)(3)

(4)执行完上述步骤后可能是需要特殊情况处理的,也可能是已经排好的最终链表,此时只需要返回新链表的头指针即可

代码实现

//常规写法ListNode* Merge(ListNode* pHead1, ListNode* pHead2){if (pHead1 == NULL && pHead2 == NULL)return NULL;if (pHead1 == NULL)return pHead2;if (pHead2 == NULL)return pHead1;ListNode* head = NULL;ListNode* next = NULL;if (pHead1->val > pHead2->val)head = pHead2;elsehead = pHead1;while (pHead1 != NULL && pHead2 != NULL){if (pHead1->val > pHead2->val){next = pHead2->next;pHead2->next = pHead1;pHead2 = next;}else{next = pHead1->next;pHead1->next = pHead2;pHead1 = next;}}return head;}
//递归版本实现ListNode* Merge(ListNode* pHead1, ListNode* pHead2){if (pHead1 == NULL) return pHead2;if (pHead2 == NULL) return pHead1;ListNode *mergeList = NULL;if (pHead1->val < pHead2->val) {mergeList = pHead1;mergeList->next = Merge(pHead1->next, pHead2);}else {mergeList = pHead2;mergeList->next = Merge(pHead1, pHead2->next);}return mergeList;}

附加题——实现1+2+3...+n,要求不能使用乘除法、循环、条件判断、选择相关的关键字。

shell脚本实现:http://blog.csdn.net/double_happiness/article/details/75090349

思路:处理这种题的思路无外乎两种循环和递归,但是题目已经从表面上将这种实现卡死,所以需要借助一些变形完成,基本的解题思路不发生改变

代码实现:

//递归思路1size_t Sum_Solution(size_t n){int ret = n;ret && (ret += Sum_Solution(n - 1));return ret;}
//递归思路2:利用模板类型求解,只适用于n比较小的情况template<unsigned int n> struct Sum_Solution{enum Value{ N = Sum_Solution<n - 1>::N + n };};template<>struct Sum_Solution<1>{enum Value{ N = 1 };};
//递归思路3:利用函数指针实现typedef unsigned int(*fun)(unsigned int n);unsigned int SolutionTemp(unsigned int n){return 0;}unsigned int solution(unsigned int n){static fun f[2] = {SolutionTemp, solution};return n + f[!!n](n - 1);}
//递归思路4:使用类的构造函数完成class temp{public:temp(){++n;sum += n;}static void init(){sum = 0;n = 0;}static unsigned int GetSum(){return sum;}private:static unsigned int sum;static unsigned int n;};//unsigned int temp::n = 0;unsigned int temp::sum = 0;unsigned int Sum(unsigned int n){temp::init();temp* p = new temp[100];delete[] p;return temp::GetSum();}
原创粉丝点击