LeetCode 0021

来源:互联网 发布:sql server 2008 激活 编辑:程序博客网 时间:2024/05/21 11:24

21.Merge Two Sorted Lists

原题链接

我的思路:

显然这条题目里所说的已经排好序,是基于这么一个假设:两个list都是按值从小到大排序的。没有出现我们之前C++作业那种,有3种可能:

  1. 两个都是从小到大排序
  2. 两个都是从大到小排序
  3. 一个是从小到大排序,另一个是从大到小排序

我已经不记得当时要求返回值的顺序是什么样子了。

我先假设是要求从小到大排序。那么从作业转换到这条题目,只需要将从大到小排序的list转换成从小到大的就行。也就是这里需要一个reverse函数。

再假设按照第1个list的顺序拼接,那么也好办,先找出第1个list的排序方案,然后按照之前假设的从小到大排序返回的做法做,只需要在最后那里加上按第1个list排序,也就是看情况调用或者不调用reverse函数。

对于这条题目,我用的是非递归的做法,在做的过程中,需要注意的一个点是,这里没有办法申请一个空的节点,所以需要申请一个头结点作为辅助。另外,为了返回值,需要一个辅助指针。只能说,手撕链表还是很难受的,STL很好用。

我的代码:

丑,请轻喷

/** * Definition for singly-linked list. * struct ListNode { *     int val; *     ListNode *next; *     ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public:    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {        ListNode* result = new ListNode(0);        ListNode* helper = result;        while(l1 && l2) {            if(l1->val < l2->val) {                helper->next = l1;                l1 = l1->next;            } else {                helper->next = l2;                l2 = l2->next;            }            helper = helper->next;        }        helper->next = l1 ? l1 : l2;        return result->next;    }};
原创粉丝点击