Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 965681a

Browse files
committed
feat: 合并链表和数组
1 parent 5c411e7 commit 965681a

File tree

2 files changed

+181
-0
lines changed

2 files changed

+181
-0
lines changed

合并两个有序数组.js

Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
/**
2+
88. 合并两个有序数组
3+
给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 num1 成为一个有序数组。
4+
5+
6+
7+
说明:
8+
9+
初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。
10+
你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。
11+
12+
13+
示例:
14+
15+
输入:
16+
nums1 = [1,2,10,0,0,0], m = 3
17+
nums2 = [2,5,6,7], n = 3
18+
19+
输出: [1,2,2,3,5,6]
20+
*/
21+
22+
/**
23+
* @param {number[]} nums1
24+
* @param {number} m
25+
* @param {number[]} nums2
26+
* @param {number} n
27+
* @return {void} Do not return anything, modify nums1 in-place instead.
28+
*/
29+
const merge = function(nums1, m, nums2, n) {
30+
let i = m - 1
31+
let j = n - 1
32+
// 尾部指针
33+
let k = nums1.length - 1
34+
while (j >= 0) {
35+
let n1 = nums1[i]
36+
let n2 = nums2[j]
37+
38+
if (n1 > n2) {
39+
nums1[k] = n1
40+
k--
41+
i--
42+
} else {
43+
nums1[k] = n2
44+
k--
45+
j--
46+
}
47+
}
48+
}
49+
50+
var a = [1, 2, 10, 0, 0, 0]
51+
merge(a, 3, [2, 5, 6, 7], 4)
52+
53+
console.log(a)
54+
55+
/**
56+
[1,2,10,0,0,0,0]
57+
58+
[2,5,6,7]
59+
60+
61+
[1,2,10,0,0,0,+10]
62+
63+
[2,5,6,7]
64+
65+
66+
[1,2,10,0,0,+7,10]
67+
68+
[2,5,6,7]
69+
70+
71+
[1,2,10,0,+6,7,10]
72+
73+
[2,5,6,7]
74+
75+
76+
[1,2,0,+5,6,7,10]
77+
78+
[2,5,6,7]
79+
80+
81+
[1,2,+2,5,6,7,10]
82+
83+
[2,5,6,7]
84+
指针移动完毕
85+
*/
86+
87+
/**
88+
* @param {number[]} nums1
89+
* @param {number} m
90+
* @param {number[]} nums2
91+
* @param {number} n
92+
* @return {void} Do not return anything, modify nums1 in-place instead.
93+
*/
94+
const merge2 = function(nums1, m, nums2, n) {
95+
// 初始化两个指针的指向,初始化 nums1 尾部索引k
96+
let i = m - 1, j = n - 1, k = m + n - 1
97+
// 当两个数组都没遍历完时,指针同步移动
98+
while(i >= 0 && j >= 0) {
99+
// 取较大的值,从末尾往前填补
100+
if(nums1[i] >= nums2[j]) {
101+
nums1[k] = nums1[i]
102+
i--
103+
k--
104+
} else {
105+
nums1[k] = nums2[j]
106+
j--
107+
k--
108+
}
109+
}
110+
111+
// nums2 留下的情况,特殊处理一下
112+
while(j>=0) {
113+
nums1[k] = nums2[j]
114+
k--
115+
j--
116+
}
117+
};
118+
119+
var a2= [1, 2, 0, 0, 0, 0]
120+
merge(a2, 2, [2, 5, 6], 4)
121+
122+
console.log(a2)

合并两个有序链表.js

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
function ListNode(val) {
2+
this.val = val
3+
this.next = null
4+
}
5+
6+
var node1 = new ListNode(1)
7+
node1.next = new ListNode(2)
8+
node1.next.next = new ListNode(4)
9+
10+
var node2 = new ListNode(1)
11+
node2.next = new ListNode(3)
12+
node2.next.next = new ListNode(4)
13+
/**
14+
* @param {ListNode} l1
15+
* @param {ListNode} l2
16+
* @return {ListNode}
17+
*/
18+
var mergeTwoLists = function(l1, l2) {
19+
var arr = []
20+
if (!l1 && !l2) {
21+
return null
22+
}
23+
while (l1 || l2) {
24+
var runL1 = () => {
25+
arr.push(l1.val)
26+
l1 = l1.next
27+
}
28+
var runL2 = () => {
29+
arr.push(l2.val)
30+
l2 = l2.next
31+
}
32+
if (!l1) {
33+
runL2()
34+
} else if (!l2) {
35+
runL1()
36+
} else if (l1.val > l2.val) {
37+
runL2()
38+
} else {
39+
runL1()
40+
}
41+
}
42+
return arrToList(arr)
43+
}
44+
45+
function arrToList(arr) {
46+
let i = 0
47+
let r = new ListNode()
48+
let head = r
49+
while (i < arr.length) {
50+
head.val = arr[i]
51+
if (++i < arr.length) {
52+
head.next = new ListNode()
53+
head = head.next
54+
}
55+
}
56+
return r
57+
}
58+
59+
console.log(JSON.stringify(mergeTwoLists(node1, node2)))

0 commit comments

Comments
 (0)