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;
}

  思路二:

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

 

posted @ 2018-01-15 20:47  番茄汁汁  阅读(111)  评论(0编辑  收藏  举报