86.LeetCode - 分隔链表:解题思路清晰

49 阅读2分钟

前言

你好, 我是Cici。数据结构和算法属于我们技术人员的内功,不管技术怎么更新,它始终都是不变的。无论是出于笔试面试需求,还是个人兴趣爱好,算法题都是值得我们去研究的。 我个人认为想要真正做好一道题目,首先最重要的一件事是 “读懂题目,提取关键信息”,这样思路才能更加清晰。第二件事就是在编写代码时要多结合框架思维,什么是框架?说白了就是某一类题型的解题模板,利用框架(利用模板)从整体到细节、从抽象到具体的来解决问题,用这样的思维学习其他知识时也是通用的。

往期同类题目推荐:
21.LeetCode - 合并两个有序链表:解题思路清晰

一、题目分析

原题链接:86. 分隔链表

观察题目,我们可以得到的关键信息有:

  • 要对一个链表进行分隔
  • 保留 两个分区中每个节点的初始相对位置

二、思路

由关键信息,既然要对现有链表进行分隔,我们可以把原链表分成两个小链表,一个链表中的元素大小都小于 x,另一个链表中的元素都大于等于 x,最后再把这两条链表接到一起,就得到了答案。
解决合并、分隔链表问题的精髓在于虚拟头节点,这里我们依然要借助虚拟头节点来解决问题。

三、参考代码

class Solution {
    public ListNode partition(ListNode head, int x) {
        ListNode h1 = new ListNode(-1);
        ListNode h2 = new ListNode(-1);

        ListNode temp = head;
        ListNode t1 = h1;
        ListNode t2 = h2;

        while(temp != null){
            if(temp.val < x){
                t1.next = temp;
                temp = temp.next;
                t1 = t1.next;
                t1.next = null; // 断开连接
            }else{
                t2.next = temp;
                temp = temp.next;
                t2 = t2.next;
                t2.next = null;
            }
        }
        t1.next = h2.next;
        return h1.next;
    }
}

四、最后

放平心态,努力学习,认真工作,做自己该做的事情,努力实现自己的目标

您的点赞收藏是对我最大的鼓励! 如果大家有什么疑问,欢迎在评论区一起讨论!