合并K个排序链表【php版】

47 篇文章 1 订阅

在这里插入图片描述
链表的结构定义如下

/**
 * Definition for a singly-linked list.
 * class ListNode {
 *     public $val = 0;
 *     public $next = null;
 *     function __construct($val = 0, $next = null) {
 *         $this->val = $val;
 *         $this->next = $next;
 *     }
 * }
 */

解法:1. 归并法(分治) 2. 利用优先队列

class Solution {

	/**
	 * 利用优先队列,快速求出当前lists中最小的元素结点
	 * @param ListNode[] $lists
	 * @return ListNode
	 */
	function mergeKLists($lists) {
		$myPriQueue = new class extends SplPriorityQueue {
			public function compare($priority1, $priority2)
			{
				return $priority2 - $priority1;
			}
		};
		foreach ($lists as $node) {
			if (!is_null($node)) {
				$myPriQueue->insert($node, $node->val);
			}
		}
		$head = new ListNode(0);
		$prev = $head;
		while (!$myPriQueue->isEmpty()) {
			$minNode = $myPriQueue->extract();
			$prev->next = $minNode;
			$prev = $prev->next;
			if (!is_null($minNode->next)) {
				$minNode = $minNode->next;
				$myPriQueue->insert($minNode, $minNode->val);
			}
		}
		return $head->next;
	}

	/**
	 * 使用归并的方法
	 * @param $lists
	 */
	function mergeKlistV2($lists) {
		return $this->merge($lists, 0, count($lists)-1);
	}
	function merge(&$lists, $l, $r) {
		if ($l == $r) {
			return $lists[$l];
		}
		if ($l > $r) {
			return null;
		}
		$mid = $l + intdiv($r-$l, 2);
		return $this->mergeTwoLists($this->merge($lists, $l, $mid), $this->merge($lists, $mid+1, $r));
	}
	function mergeTwoLists($node1, $node2) {
		$head = new ListNode(0);
		$prev = $head;

		while ($node1 && $node2) {
			if ($node1->val < $node2->val) {
				$prev->next = $node1;
				$node1 = $node1->next;
			} else {
				$prev->next = $node2;
				$node2 = $node2->next;
			}
			$prev = $prev->next;
		}
		$node1 ? $prev->next = $node1 : $prev->next = $node2;
		return $head->next;
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值