leetcode_86

淳属虚构 · · 468 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

Golang:

思路:搬运我的题解

这题在第一次做的时候嫌麻烦,直接用数组解决了,时间百分百,空间百分之五,还是有些不满意的,就用双指针重新写了下,然后来到了双百效率
思路在代码里有提及,就不再详述了,简单说一下这里替换的含义
1->4->3->2->5->2, x = 3
发生替换的时候
p1 p2 p3
1->4->3->2->5->2
这里怎么替换,就是:
先从原链表里提取出p3,
然后将p3插到p1及p1后面的元素之间,
更新p1,更新p3

代码如下:

func partition(head *ListNode, x int) *ListNode {
    if head==nil||head.Next==nil {
        return head
    }
    //什么时候需要替换呢?
    //当我找到某个元素p3,p3.Val<x,并且该元素前一个元素p2,且p2的值要>=x
    //这个时候,如果我们有标记位p1,那么:p2->next=p3->next,p3->next=p1->next,p1->next=p3
    //如果没有标记位p1,那么说明head及以后都是>=x的,此时p2->next=p3->next,p3->next=head,p3更新为头节点
    //标记位p1如何找及更新,找:从head开始最后一个<x的即是,更新,每当发生换位,即更新
    var p1,p2,p3 *ListNode
    p3=head
    res:=head
    for p3!=nil{
        if p2!=nil&&p2.Val>=x&&p3.Val<x {
            if p1!=nil {
                p2.Next=p3.Next
                p3.Next=p1.Next
                p1.Next=p3
                //在这种情况下,p3应该发生相应的变化
                p1=p3
                p3=p2.Next
            }else{
                p2.Next=p3.Next
                p3.Next=res
                res=p3
                p1=p3
                p3=p2.Next
            }
        }else{
            if p3.Val<x {
                p1=p3
            }
            p2=p3
            p3=p3.Next
        }
    }
    return res
}

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:淳属虚构

查看原文:leetcode_86

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

468 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传