合并两个排序的链表
合并两个排序的列表
题目描述
输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。
数据范围
链表长度 [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;
            } 
        }
};
点评
- 
迭代版本是新建了一个list。可以重点看看
dummy节点的使用。还有一个亮点是cur -> next = (l1 != NULL ? l1 : l2);这样子就比较简洁。自己在迭代版本也使用了相同的技巧。 - 
递归版本的处理比较新颖。自己的递归基没有想错,但是递归的处理想错了。其实是对第一个节点讨论。
 
                    
                
                
            
        
浙公网安备 33010602011771号