程序员面试金典-面试题 02.04. 分割链表
Posted silentteller
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了程序员面试金典-面试题 02.04. 分割链表相关的知识,希望对你有一定的参考价值。
题目:
编写程序以 x 为基准分割链表,使得所有小于 x 的节点排在大于或等于 x 的节点之前。如果链表中包含 x,x 只需出现在小于 x 的元素之后(如下所示)。分割元素 x 只需处于“右半部分”即可,其不需要被置于左右两部分之间。
示例:
输入: head = 3->5->8->5->10->2->1, x = 5
输出: 3->1->2->10->5->5->8
分析:
可以新建两个链表存储小于x的节点和大于等于x的节点,然后再将两个链表拼接返回即可。
不过上面的方法需要额外的空间,我们可以直接在链表上操作,当节点的val小于x时,可以将当前节点删除,移到头节点前面,并更新头节点。
程序:
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Solution { public ListNode partition(ListNode head, int x) { ListNode l1 = new ListNode(-1); ListNode l2 = new ListNode(-1); ListNode p1 = l1; ListNode p2 = l2; while(head != null){ if(head.val < x){ p1.next = new ListNode(head.val); p1 = p1.next; }else{ p2.next = new ListNode(head.val); p2 = p2.next; } head = head.next; } p1.next = l2.next; return l1.next; } }
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Solution { public ListNode partition(ListNode head, int x) { ListNode p = head; while(p != null && p.next != null){ if(p.next.val < x){ ListNode node = p.next; p.next = node.next; node.next = head; head = node; }else{ p = p.next; } } return head; } }
以上是关于程序员面试金典-面试题 02.04. 分割链表的主要内容,如果未能解决你的问题,请参考以下文章
链表题 面试题02.04. 分割链表290. 单词规律20. 有效的括号
Leetcode刷题笔记之链表篇面试题 02.04. 分割链表