纪念一次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的一种喜悦感。希望以后能越来越多的一次通过。