21.合并两个有序链表
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例 1:
输入:l1 = [1,2,4], l2 = [1,3,4] 输出:[1,1,2,3,4,4]
(1)迭代法
思路:这个思路是能直接想到的,跟合并有序数组是一样的,list1和list2都不为空的时候就比较val值。要搞个哨兵节点 这样就能直接连接到新链表的头结点了
实现:
var mergeTwoLists = function (list1, list2) {
// 哨兵节点
let dummy = new ListNode(-1)
let cur = dummy
while (list1 !== null && list2 !== null) {
if(list1.val <= list2.val) {
cur.next = list1
list1 = list1.next
} else {
cur.next = list2
list2 = list2.next
}
cur = cur.next
}
// 合并后 还剩list1或者list2剩下的链表 直接拼接上
cur.next = list1 !== null ? list1 : list2
// 真正需要返回的链表在哨兵节点后
return dummy.next
};
(2)递归法
思路:递归是我这种小喽啰想不出的,但是看了确实蛮巧妙
list1[0]+merge(list1[1:],list2) list1[0]<=list2[0]
list2[0]+merge(list1,list2[1:]) list1[0]>list2[0]
实现:
var mergeTwoLists = function(list1, list2) {
// 如果list1为空 就返回list2剩余的链表拼接到新链表后面
if(list1 === null){
return list2
}else if(list2 === null){
return list1
}else {
if(list1.val <= list2.val ){
list1.next = mergeTwoLists(list1.next,list2)
return list1
}else{
list2.next = mergeTwoLists(list1,list2.next)
return list2
}
}
};
5.最长回文子串
给你一个字符串
s
,找到s
中最长的 回文子串示例 1:
输入:s = "babad" 输出:"bab" 解释:"aba" 同样是符合题意的答案。示例 2:
输入:s = "cbbd" 输出:"bb"
思路:中心扩展法
把s每个字符都视为回文的中心
回文长度是奇数:中心就是i;
回文长度是偶数:中心就是i和i+1
实现:
var longestPalindrome = function(s) {
if(s.length < 2) return s
let res = ''
for(let i = 0;i < s.length;i++){
spray(i,i)
spray(i,i+1)
}
return res
function spray(m,n){
// 满足回文条件 循环
while(m >= 0 && n < s.length && s[m] == s[n]){
m--
n++
}
// 直到不满足 此时回文的索引应该是 [m+1,n-1]
// 这次循环的回文长度 = (n-1)-(m+1)+1
if(res.length < n-m-1){
res = s.slice(m+1,n) // 取[m+1,n-1]区间
}
}
};