LeetCode刷题笔录Partition List

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 x
		while (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 x
		ListNode part2Head = p1;
		if (part2Head != null && part2Head.next != null) {
			ListNode p2 = p1.next;
			while (p2 != null) {
				if (p2.val < x) {
					// append p2 to the lower list
					p.next = p2;
					p = p.next;
					p2 = p2.next;
					p1.next = p2;
					p.next = null;
					continue;
				} else {
					// move p1 and p2 forward
					p1 = 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值