LeetCode 0021

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;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值