Given a linked list and a value x, partition it such that all nodes less than x come before nodes greater than or equal to x.
You should preserve the original relative order of the nodes in each of the two partitions.
For example,
Given 1->4->3->2->5->2 and x = 3,
return 1->2->2->4->3->5.
1 public static LinkedListNode PartitionList(LinkedListNode head, int x) 2 { 3 if (head == null) 4 return null; 5 6 LinkedListNode ret = new LinkedListNode(); 7 LinkedListNode retcurr = ret; 8 LinkedListNode curr = head; 9 10 while (curr != null) 11 { 12 if ((int)curr.Value < x) 13 { 14 retcurr.Value = (int)curr.Value; 15 if (curr.Next != null) 16 { 17 retcurr.Next = new LinkedListNode(); 18 retcurr = retcurr.Next; 19 } 20 } 21 curr = curr.Next; 22 } 23 24 curr = head; 25 26 while (curr != null) 27 { 28 if ((int)curr.Value >= x) 29 { 30 retcurr.Next = new LinkedListNode(); 31 retcurr = retcurr.Next; 32 retcurr.Value = (int)curr.Value; 33 } 34 curr = curr.Next; 35 } 36 37 return ret; 38 }
代码分析:
O(n),新建一个linkedlistnode,扫两遍,第一遍把小于x的复制并append到新建的node里面,第二遍,把大于等于x的复制的append。
好像有点过于简单。
如果要求in place呢,就是空间复杂度要constant。
1 public static LinkedListNode PartitionList2(LinkedListNode head, int x) 2 { 3 if (head == null) 4 return null; 5 6 LinkedListNode fakehead = new LinkedListNode(); 7 fakehead.Next = head; 8 9 LinkedListNode curr = fakehead; 10 11 while (curr.Next != null) 12 { 13 if ((int)curr.Next.Value < x) 14 { 15 curr = curr.Next; 16 } 17 //if curr.Next.Value >= x 18 else 19 { 20 //if curr.Next is the last one, return fakehead.Next 21 if (curr.Next.Next == null) 22 return fakehead.Next; 23 24 LinkedListNode next = curr.Next; 25 LinkedListNode prev = curr.Next; 26 LinkedListNode target = prev.Next; 27 28 //find the next node that value < x 29 while ((int)target.Value >= x) 30 { 31 if (target.Next != null) 32 { 33 target = target.Next; 34 prev = prev.Next; 35 } 36 else 37 return fakehead.Next; 38 } 39 40 //swap the nodes (curr.Next and target) 41 curr.Next = target; 42 prev.Next = target.Next; 43 target.Next = next; 44 45 curr = curr.Next; 46 } 47 } 48 49 return fakehead.Next; 50 }
代码分析:
In place的做法。 但是时间复杂度 worse case O(n2)。 看题目要求选择哪个答案吧。
代码中建了一个fakehead,然后设fakehead.Next = head,使下面的算法适用于所有node, 包括 head。