【算法】分隔链表

Quibbler 2月前 175

【算法】分隔链表


        链表是算法中比较能考察逻辑和编码基本功的题型。这道题有意思的是题目描述很唬人,看着有点难度是mid,仔细分析实际上只能算easy。

给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。你应当 保留 两个分区中每个节点的初始相对位置。


示例 1:输入:head = [1,4,3,2,5,2], x = 3输出:[1,2,2,4,3,5]

示例 2:输入:head = [2,1], x = 2输出:[1,2]


        题目描述的比较绕,其实只需要遍历一遍链表:把比给定x节点小的都放在前面,大于或者等于x节点的都放在后面,保持有来的相对位置不变。最后再把两截链表拼上即可。

    public ListNode partition(ListNode head, int x) {
        //定义两个链表
        ListNode head1 = new ListNode(-1);
        ListNode head2 = new ListNode(x);
	
        //临时保存遍历过程中当前节点
        ListNode tmp1 = head1, tmp2 = head2;
	
        while (head != null) {
            if (head.val < x) {
                //把比给定x节点小的都放在前面
                tmp1.next = head;
                tmp1 = tmp1.next;
            }else{
                //大于或者等于x节点的都放在后面
                tmp2.next = head;
                tmp2 = tmp2.next;
            }
            head = head.next;
        }
        
        //一定要把这个链表尾部置空,因为可能已经链接到其它位置去。
        tmp2.next = null;
	
        //尾部tmp1和头部head2,前后两个链表拼接上
        tmp1.next = head2.next;
        
        return head1.next;
    }


不忘初心的阿甘
最新回复 (0)
    • 安卓笔记本
      2
        登录 注册 QQ
返回
仅供学习交流,切勿用于商业用途。如有错误欢迎指出:fluent0418@gmail.com