合并两个排序的链表

合并两个排序的列表

题目描述

输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。

数据范围

链表长度 [0,500][0,500]。

样例

输入:1->3->5 , 2->4->5

输出:1->2->3->4->5->5

代码实现

迭代版本

 struct ListNode {
     int val;
     ListNode *next;
     ListNode(int x) : val(x), next(NULL) {}
 };

class Solution {
public:
    ListNode* merge(ListNode* l1, ListNode* l2) {
      
        ListNode *dummy = new ListNode(0);
        ListNode *cur = dummy;
      
        while (l1 != NULL && l2 != NULL) {
            if (l1 -> val < l2 -> val) {
                cur -> next = l1;
                l1 = l1 -> next;
            }
            else {
                cur -> next = l2;
                l2 = l2 -> next;
            }
            cur = cur -> next;
        }
        cur -> next = (l1 != NULL ? l1 : l2);
        return dummy -> next;
    }
};

递归版本

struct ListNode {
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};

class Solution {
    public :
        ListNode* merge(ListNode* l1, ListNode* l2) {
            if(!l1 || !l2) return (l1 != NULL ? l1 : l2);

            if(l1->val < l2->val) {
                l1->next = merge(l1->next, l2);
                return l1;
            }
            else{
                l2->next = merge(l1, l2->next);
                return l2;
            } 
        }
};

点评

  1. 迭代版本是新建了一个list。可以重点看看dummy节点的使用。还有一个亮点是cur -> next = (l1 != NULL ? l1 : l2); 这样子就比较简洁。自己在迭代版本也使用了相同的技巧。

  2. 递归版本的处理比较新颖。自己的递归基没有想错,但是递归的处理想错了。其实是对第一个节点讨论。

posted @ 2024-03-21 16:30  哎呦_不想学习哟~  阅读(11)  评论(0)    收藏  举报