小言_互联网的博客

【LintCode 题解】亚马逊中国二面算法题 :链表划分

479人阅读  评论(0)

一面主要是过往自己认为最优秀的项目讲解,问的比较细;
二面两个算法题比较简单,一个是LintCode 96原题,另一个是给定一组区间表示登陆登出时间,求同时段最大在线人数。

亚麻面试非常喜欢考原题,想在短时间内突击面试的话,可以多刷几遍高频题,或者上九章的高频题班都可以大大节约准备算法面试的时间。

下面主要看下这道题在LintCode上的解法。

 

题目:链表划分 Partition list

描述:

给定一个单链表和数值x,划分链表使得所有小于x的节点排在大于等于x的节点之前。

你应该保留两部分内链表节点原有的相对顺序。

样例

样例 1:

输入: list = null, x = 0
输出: null    
样例解释: 空链表本身满足要求

样例 2:

输入: list = 1->4->3->2->5->2->null, x = 3
输出: 1->2->2->4->3->5->null    
样例解释: 要保持原有的相对顺序。

题解

双指针方法,用两个指针将两个部分分别串起来。最后在将两个部分拼接起来。
left指针用来串起来所有小于x的结点,
right指针用来串起来所有大于等于x的结点。
得到两个链表,一个是小于x的,一个是大于等于x的,做一个拼接即可。

这里可以在线评测并查看其他语言的解法


  
  1. public class Solution {
  2. public ListNode partition(ListNode head, int x) {
  3. if (head == null) {
  4. return null;
  5. }
  6. ListNode leftDummy = new ListNode( 0);
  7. ListNode rightDummy = new ListNode( 0);
  8. ListNode left = leftDummy, right = rightDummy;
  9. while (head != null) {
  10. if (head.val < x) {
  11. left.next = head;
  12. left = head;
  13. } else {
  14. right.next = head;
  15. right = head;
  16. }
  17. head = head.next;
  18. }
  19. right.next = null;
  20. left.next = rightDummy.next;
  21. return leftDummy.next;
  22. }
  23. }

 


转载:https://blog.csdn.net/JiuZhang_ninechapter/article/details/104430074
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场