剑指offer刷题【链表篇】


前言


以下是本篇文章正文内容,难度从难到易,反向训练法,如果基础较差可从后面做起,更加容易理解

💌两个链表的第一个公共节点

题目描述:

输入两个链表,找出它们的第一个公共节点。

思路描述:

设第一个公共节点为node,链表headA的节点数量为a,链表headB的节点数量为b,两链表的公共尾部的节点数量为c,则有:

  • 头节点headA到node前,共有a-c个节点;
  • 头节点headB到node前,共有b-c个节点;

遍历完headA,再遍历headB当走到node时,经过的节点数:a+b-c
遍历完headB,再遍历headA当走到node时,经过的节点数:b+a-c
可由此遍历得出第一个公共节点,代码参考下面

代码实现:

public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        ListNode A = headA, B = headB;
        while (A != B) {
            A = A != null ? A.next : headB;
            B = B != null ? B.next : headA;
        }
        return A;
    }
}

💊合并两个排序的链表

题目描述:

输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。

输入:1->2->4 ,1->3->4
输出:1->1->2->3->4->4

思路描述:

简单的链表拼接问题,注意结束条件

代码实现:

class Solution {
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        ListNode head = new ListNode(0);
        ListNode t = head;
        while(l1!=null&&l2!=null){
            if(l1.val<l2.val){
                t.next = l1;
                l1 = l1.next;
            }else{
                t.next = l2;
                l2 = l2.next;
            }
            t = t.next;
        }
        t.next = l1!=null?l1:l2;
        return head.next;
    }
}

🍬链表中的倒数第k个节点

题目描述:

输入一个链表。输出该链表的第k个节点

给定一个链表:1->2->3->4->5 和 k=2
返回链表 4->5

思路描述:

有两种解法,
第一种是遍历一遍记录总数,再减去k,即可得出倒数第k个节点了
第二种是采用双指针,设置两个节点before,latter,先将before节点前进k位,之后再两个节点同时向后前进,等before节点为空时,则latter节点刚好为倒数第k个节点

代码实现:

class Solution {
    public ListNode getKthFromEnd(ListNode head, int k) {
        ListNode former = head, latter = head;
        for(int i = 0; i < k; i++)
            former = former.next;
        while(former != null) {
            former = former.next;
            latter = latter.next;
        }
        return latter;
    }
}

//个人解法(先遍历得长度,再遍历)
class Solution {
    public ListNode getKthFromEnd(ListNode head, int k) {
        ListNode temp = head;
        int count =0;
        while(temp!=null){
            count++;
            temp = temp.next;
        }
        temp = head;
        for(int i = 0;i<count-k;i++){
            temp = temp.next;
        }
        return temp;
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

取酒鱼食--【余九】

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值