纪念一次leetcode提交一次就accepted的喜悦

2017-02-08  本文已影响60人  小前seant

题目比较简单:

<h2>Merge Two Sorted Lists</h2>
<h5>Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists.</h5>

简要说就是合并两个有序链表。
如果新建一个列表,遍历两个列表依据大小复制到新列表中,比较简单,但是空间复杂度为O(n+m),所以想着直接在原列表上合并;

直接上JS代码:

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} l1
 * @param {ListNode} l2
 * @return {ListNode}
 */
var mergeTwoLists = function(l1, l2) {
    var prev = null;
    var last = null;
    if (l1 && l2 && l1.val > l2.val) {
        return mergeTwoLists(l2, l1); //保证起始状态l1头结点小于l2的
    }
    var head = l1 ? l1 : l2;
    while (l1 && l2) {
        prev = l1;
        while (l1 && l1.val <= l2.val) {
            prev = l1;
            l1 = l1.next;
        }
        //开始第一个大于l2的,此时l1.val > l2.val
        if (l1) {
            prev.next = l2;
            last = l2;
            while (l2 && l2.val < l1.val) {
                last = l2;
                l2 = l2.next;
            }
            last.next = l1;
        } else {
            prev.next = l2;
        }
    }
    return head;
};

思路也很简单:将l2并入到l1中(l1的头结点<l2的头结点)。思考两种情况:l1的结点什么时候大于l2的结点,当大于的时候怎么做,小于的时候怎么做即可。于是有了上述代码,不复杂一看就明白。
写此记录一下第一次提交就accepted的一种喜悦感。希望以后能越来越多的一次通过。

上一篇下一篇

猜你喜欢

热点阅读