代码随想录day04 两两交换链表节点,删除链表倒数第N个节点,链表相交,环形链表II

两两交换链表节点

题目:https://leetcode.cn/problems/swap-nodes-in-pairs/
思路:如图

要点:

  1. 注意加虚拟头节点。使头节点操作与其他节点统一
  2. 需要保存需要交换的两个元素的前一个元素
  3. 注意交换的顺序
    代码:
var swapPairs = function(head) {
  let cur = new ListNode(0,head)
  let newHead = cur;
  let temp1 =null;
  let temp2 =null;

  while(cur.next && cur.next.next){
  temp1 = cur.next//1
  temp2 = cur.next.next.next//1

  cur.next = temp1.next//2
  cur.next.next = temp1//3
  temp1.next = temp2//4

  cur = cur.next.next

  }
  return newHead.next
};

删除链表倒数第N个节点

题目:https://leetcode.cn/problems/remove-nth-node-from-end-of-list/
思路:双指针

链表相交

题目:https://leetcode.cn/problems/intersection-of-two-linked-lists-lcci/
思路:

  1. 求出两个链表的长度,并求出两个链表长度的差值,然后让curA移动到,和curB 末尾对齐的位置。
  2. 比较curA和curB是否相同,如果不相同,同时向后移动curA和curB,如果遇到curA == curB,则找到交点(注意不是值相同)


    image.png

    代码:

var getIntersectionNode = function(headA, headB) {
    let n1=0;
    let n2=0;
    let p1 = headA
    let p2 = headB
    while(p1){
        n1++;
        p1=p1.next
    }
    while(p2){
        n2++;
        p2=p2.next
    }

    let count= Math.abs(n1-n2)
    console.log(n1)
    console.log(n2)
    p1=headA;
    p2=headB
    if(n1 < n2) {       // 让p1为最长链表的头,n1为其长度
        // 交换变量注意加 “分号” ,两个数组交换变量在同一个作用域下时
        // 如果不加分号,下面两条代码等同于一条代码: [p1, p2] = [n2, n1]
        [p1, p2] = [p2, p1];
        [n1, n2] = [n2, n1];
    }
    while(count--) {  // 让p1和p2在同一起点上(末尾位置对齐)
        p1 = p1.next;
    }

    while(p1){
        if(p1===p2){
            return p1
        }
            p1=p1.next
            p2=p2.next
    }
    return null
};

环形链表II

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容