7.05 双指针01

75 阅读1分钟

1 . 两个链表的第一个公共节点

[](剑指 Offer 52. 两个链表的第一个公共节点 - 力扣(LeetCode))

0435.png

分析 : 假设 A 链表不与 B 链表相交的部分长为 a , B 链表不与 A 链表相交的部分长为 b ,相交部分为 c 。 使用双指针 p1 、p2 分别指向两个链表头进行遍历 ,

  • 两链表长度一样且相交 ,则当两指针所指结点相等时 ,则是两链表的交点处。
  • 两链表长度不一样但相交 ,则当 p1指针 遍历到 A 链表尾部时 ,再将其指向 B 链表头部 , p2同理。两者所指结点相等时 ,刚好是两链表相交处 ,且此时两者恰好都走了 a + b + c 步 。
  • 两链表长度一样但不相交 ,两者同时相等且都为 null 。
  • 两链表长度不一样且不相交 ,两者各走 a + b 后同时相等且都为 null 。
var getIntersectionNode = function(headA, headB) {
    if(!headA||!headB) return null;
    var pA = headA;
    var pB = headB;
    while(pA!==pB)
    {
        pA = pA? pA.next : headB;
        pB = pB? pB.next : headA;
    }
    return pA;
};

2 . 反转单词顺序

[](剑指 Offer 58 - I. 翻转单词顺序 - 力扣(LeetCode))

0436.png

该题就可以借助 JS 里封装的各种 API

var reverseWords = function(s) {
    var arr1 = s.split(" ");
    var arr2 = arr1.filter((item)=>{
        return item!==""&&item!==" ";
    })
    var arr3 = arr2.reverse();
    var t = arr3.join(" ");
    return t;
};

注意 : 该题要注意 "" 和 " " , 开始将字符串转为数组时 ,要注意去除数组里的 "" 和 " " 元素 ,因为最后将数组转为字符串时 ,用的 string . join(" ")方法会自动将单词之间加上空格 " " 。