前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >每日三题-合并两个有序链表、相交链表、删除链表的第N个节点

每日三题-合并两个有序链表、相交链表、删除链表的第N个节点

作者头像
才疏学浅的木子
发布2022-11-13 09:30:24
2340
发布2022-11-13 09:30:24
举报
文章被收录于专栏:CSDN文章

👨‍💻个人主页: 才疏学浅的木子 🙇‍♂️ 本人也在学习阶段如若发现问题,请告知非常感谢 🙇‍♂️ 📒 本文来自专栏: 算法 🌈 算法类型Hot100题 🌈

每日三题

删除链表的倒数第N个结点

解法一

使用双指针 新建一个头节点,避免出现删除头节点出现异常的情况 比如[1],1 就会出现问题因为slow.next = slow.next.next 中slow.next会报空指针异常 而新建一个节点后 [newHead,1],1,slow为newhead,那就不会出现空指针异常,并且这个时候的slow就是要删除节点的前一个节点 不需要维护一个pre节点

代码语言:javascript
复制
class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        if(head == null || n == 0) return head;
        ListNode newHead = new ListNode(0,head); // 有可能删除的是头节点
        ListNode slow = newHead; // slow 保存的是需要删除节点的前一个节点
        ListNode quick = head;
        while(quick != null && n != 0){ // 找到比他快n的节点
            quick = quick.next;
            n--;
        }
        while(quick != null){  // 同时往后移动
            quick = quick.next;
            slow = slow.next;
        }
        slow.next = slow.next.next;
        return newHead.next;
    }
}

合并两个有序链表

解法一

双指针 list1指向第一个节点,list2指向第二个节点,同时比较大小,谁小就往后移动 如果list1为空了,则把t指向list2,反之同理

代码语言:javascript
复制
class Solution {
    public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
        if(list1 == null) return list2;
        if(list2 == null) return list1;
        ListNode res = new ListNode();
        ListNode t = res;
        while(list1 != null && list2 !=null){
            if(list1.val < list2.val){
                t.next = list1;
                list1 = list1.next;
            }else{
                t.next = list2;
                list2 = list2.next;
            }
            t = t.next;
        }
        if(list1 != null)t.next = list1; // 为空直接指向另一个指针
        if(list2 != null)t.next = list2;
        return res.next;
    }
}

相交链表

解法一

使用双指针 ta指向headA,tb指向headB ta,tb同时往后移,如果为空了,则将当前节点设置为另一个链表的头节点 原理 有相交 A [a1,a2,c1,c2,c3] B [b1,b2,b3,c1,c2,c3] 则当ta走完A链表时候走的长度为a+c,当b走完B链表时候长度为b+c 则ta指向B,tb指向A 当ta为c1时候走的长度为a+c+btb为c1时候走的长度为b+c+a 没有相交 A[a1,a2] B[b1,b2,b3] 则A==B的时候只有A == B ==null的时候 所有当ta到达B的末尾null时候走的路程为a+b tb走到A的末尾null时候走的路程为b+a 所有也可以退出循环

代码语言:javascript
复制
public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        if(headA == null || headB ==null) return null;
        ListNode ta = headA;
        ListNode tb = headB;
        while(ta != tb){
            ta = ta != null ? ta.next:headB;
            tb = tb != null ? tb.next:headA;
        }
        return ta;
    }
}

解法二

使用哈希集合 把A中节点保存到一个集合,然后循环B中节点,如果集合中有就说明有相交直接返回,如果没有最后返回null

代码语言:javascript
复制
public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        if(headA == null || headB ==null) return null;
        HashSet<ListNode> s = new HashSet<>();
        while(headA!=null){
            s.add(headA);
            headA = headA.next;
        }
        while(headB!=null){
            if(s.contains(headB)) return headB;
            headB = headB.next;
        }
        return null;
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-11-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 每日三题
  • 删除链表的倒数第N个结点
  • 合并两个有序链表
  • 相交链表
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档