leetcode Merge Two Sorted Lists

题目:https://oj.leetcode.com/problems/merge-two-sorted-lists/

题意:按从小到大,把两个已经排好序的链表合并

没啥思路,直接往下接就行了,我用的比较笨的方法,后面附一个聪明的算法,还有突然想到以前看过的一本书也是说道,在声明指针的时候最好直接赋值,要不他会乱指,发生错误

/**
 * 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 *head,*p,*q,*r;
        if(l1 == NULL) return l2;
        if(l2 == NULL) return l1;
        p = l1;
        q = l2;
        head = NULL;
        r = NULL;
        if(p -> val > q->val){
            head = q;
            q =q -> next;
        }
        else {
            head = p;
            p = p->next;
        }
        r = head;
        r->next =NULL;
        while(p!=NULL&&q!=NULL){
            if(p->val > q->val){
                r->next = q;
                r = r->next;
                q = q ->next;

            }
            else{
                r->next = p;
                r = r->next;
                p = p ->next; 

            }
        }
        if (p)<span style="white-space:pre">		</span>//这里原先我还比较笨的写了一个循环,切记直接接入后面的内容就行了,链表还是用的不熟
            r->next = p;
        else if (q)
            r->next = q;
        
       return head; 
        
    }
};

再来一个高端算法,用的是递归,思路跟一般的俩数组排序一样,每次递归都将ret赋值好,用next去找下一次递归的结果,这样到下一次递归的时候,又重新赋值好下一个ret的本体,这个过程相当于r=p->next;r=r->next;


/**
 * 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) {
        if (l1 == NULL) return l2;
        if (l2 == NULL) return l1;
    
        ListNode *ret = NULL;
    
        if (l1->val < l2->val)
        {
            ret = l1;
            ret->next = mergeTwoLists(l1->next, l2);
        }
        else
        {
            ret = l2;
            ret->next = mergeTwoLists(l1, l2->next);
        }
        
        return ret;
        }
};



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值