LeetCode刷题笔录Partition List

来源:互联网 发布:java 防止 sql注入 编辑:程序博客网 时间:2024/05/29 07:18

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.

和之前某个链表题差不多。建一个dummy head作为所有小于x的node的表头。扫描链表,把小于x的加到新头后面并和原链表脱钩。最后把新链表和剩下的元素链表连起来就行了。中间有很多地方容易出错,要小心。

public class Solution {public ListNode partition(ListNode head, int x) {if (head == null || head.next == null)return head;ListNode newHead = new ListNode(-1);ListNode p = newHead;ListNode p1 = head;// append all nodes in the front of the list to the new head if nodes// are less than xwhile (p1 != null && p1.val < x) {p.next = p1;p = p.next;p1 = p1.next;p.next = null;}// already found the first node that is greater than or equal to xListNode part2Head = p1;if (part2Head != null && part2Head.next != null) {ListNode p2 = p1.next;while (p2 != null) {if (p2.val < x) {// append p2 to the lower listp.next = p2;p = p.next;p2 = p2.next;p1.next = p2;p.next = null;continue;} else {// move p1 and p2 forwardp1 = p2;p2 = p2.next;}}}p.next = part2Head;return newHead.next;}}


更新:

上面的解法有很多地方容易出错,其实有个更方便一点的办法,就是有两个dummy head,一个放比x小的元素一个放大于等于x的node,最后把两个list连起来就行了。这样写出错的概率会小很多。

public class Solution {    public ListNode partition(ListNode head, int x) {        ListNode d1 = new ListNode(-1);        ListNode d2 = new ListNode(-1);                ListNode pre1 = d1;        ListNode pre2 = d2;        ListNode p = head;                while(p != null){            if(p.val < x){                pre1.next = p;                p = p.next;                pre1 = pre1.next;                pre1.next = null;            }            else{                pre2.next = p;                p = p.next;                pre2 = pre2.next;                pre2.next = null;            }        }        pre1.next = d2.next;        d2.next = null;        return d1.next;    }}




0 0
原创粉丝点击