将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例 1:
输入:l1 = [1,2,4], l2 = [1,3,4] 输出:[1,1,2,3,4,4]
思路:这个思路是能直接想到的,跟合并有序数组是一样的,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
- };
思路:递归是我这种小喽啰想不出的,但是看了确实蛮巧妙
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
- }
- }
- };
给你一个字符串
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]区间
- }
- }
- };