黄哥Python: 解LeetCode 第86题“分隔链表”的两种方法

166 阅读1分钟
原文链接: zhuanlan.zhihu.com

LeetCode 第86题描述如下:

黄哥用二种思路去解决这个问题,Python3 代码用的是二个栈,将小的数字放到一个栈中,大的数字放到一个栈中,再依次出栈,尾部插入到新的链表中。

Go 语言代码是遍历原来的链表二次,第一个循环将小于x的值插入到新的链表尾部,第二个循环将大于或等于x的值,插入到新的链表尾部。

Python3 代码

# 黄哥Python培训 黄哥所写
class Solution:
    def partition(self, head: ListNode, x: int) -> ListNode:
        if head is None:
            return None
        stack1 = []
        stack2 = []
        curr = head
        while curr:
            if curr.val < x:
                stack1.append(curr.val)
            else:
                stack2.append(curr.val)
            curr = curr.next
        if stack2:
            newHead = ListNode(stack2.pop())
        elif stack1:
            newHead = ListNode(stack1.pop())
        while stack2:
            node = ListNode(stack2.pop())
            node.next = newHead
            newHead = node
        
        while stack1:
           node = ListNode(stack1.pop())
           node.next = newHead
           newHead = node
           
        return newHead


下面是Go 语言代码

// 黄哥Python培训 黄哥所写
func partition(head *ListNode, x int) *ListNode {
	if head == nil {
		return nil
	}
    var newHead *ListNode
	curr1, curr2 := head, head
    newHead = &ListNode{}
	first := newHead
	for curr1 != nil {
		if curr1.Val < x {
			node := &ListNode{
				Val: curr1.Val,
			}
			first.Next = node
			first = node
		}
		curr1 = curr1.Next
	}
	for curr2 != nil {
		if curr2.Val >= x {
			node := &ListNode{
				Val: curr2.Val,
			}
			first.Next = node
			first = node
		}
		curr2 = curr2.Next
	}
	return newHead.Next

}
黄哥:黄哥Python:提醒要转行当程序员的朋友,学习要分先后主次zhuanlan.zhihu.com图标黄哥:黄哥Python培训是这样训练学员的zhuanlan.zhihu.com图标