zoukankan      html  css  js  c++  java
  • LeetCode-21- Merge Two Sorted Lists

    一、问题描述

      给定两个链表,将他们合并成一个,其中节点值要按顺序排列。

      例子:给定链表1为1->2->4,链表2为1->3->4。合并之后链表为1->1->2->3->4->4

    二、问题解决

      思路一:

      每次比较两个头结点的值,看谁的小,依次将他们都串起来

      代码中用到一个巧妙的办法,先初始化了一个为-1的节点,然后返回该节点的next(不然一个空指针没有办法执行next,这样在进入循环的时候要判断l1和l2第一个节点的大小)。可以使代码繁琐程度大大减少。

    struct ListNode {
        int val;
        ListNode *next;
        ListNode(int x) : val(x), next(NULL) {}
    };
    
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
        if (l1 == NULL && l2 == NULL) return NULL;
        if (l1 == NULL) return l2;
        if (l2 == NULL) return l1;
        ListNode r(-1);
        ListNode* result = &r;
        while (l1 != NULL && l2 != NULL) {
            if (l1->val > l2->val) {
                result->next = l2;
                l2 = l2->next;
            }else {
                result->next = l1;
                l1 = l1->next;
            }
            result = result->next;
        }
        if (l1 == NULL)
            result->next = l2;
        if (l2 == NULL)
            result->next = l1;
        return r.next;
    }
    
    int main()
    {
        ListNode node1(1);
        ListNode node2(2);
        ListNode node3(4);
        ListNode* list1 = &node1;
        node1.next = &node2;
        node2.next = &node3;
    
        ListNode node4(1);
        ListNode node5(3);
        ListNode node6(4);
        ListNode* list2 = &node4;
        node4.next = &node5;
        node5.next = &node6;
    
        ListNode* ii = mergeTwoLists(list1, list2);
        while (ii != NULL) {
            cout << ii->val << endl;
            ii = ii->next;
        }
    
        system("pause");
        return 0;
    }

      思路二:

      使用递归,这个方法比上面的间复杂度要高,但我觉得很有意思,没有想到用递归来解决。代码就不放了。嗯

  • 相关阅读:
    数据库(DB)
    PHP课程设计
    版本号设计规则
    设计模式(Java)
    简单的流式布局(移动应用开发)
    laravel工作机制(PHP程序设计)
    接口自动化测试(软件测试)
    Java学习路线
    ES6基础知识
    promise
  • 原文地址:https://www.cnblogs.com/likaiming/p/8289880.html
Copyright © 2011-2022 走看看