合并两个排序的链表
题目:
输入两个递增排序的链表, 合并这两个链表并使新链表中的节点仍然是递增排序的.
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
限制:
0 <= 链表长度 <= 1000
题解1
/**
* Definition for a singly-linked list.
* class ListNode {
* public $val = 0;
* public $next = null;
* function __construct($val) { $this->val = $val; }
* }
*/
class Solution {
/**
* @param ListNode $l1 1->2->4
* @param ListNode $l2 1->3->4
* @return ListNode
* 解题思路: 两个链表去依次判断,当链表1的第一个值小于链表2的第一个值时,把链表1的第一个值先放入新链表中,
* 之后再去while中执行第二次,第二次是链表链表1的第二个值和链表2的第一个值对比,如果链表1的第二个值大于链表2的第一个值
* 那么就把链表2的第一个值再放入到上面新链表中,再去对比链表1的第二个值和链表2的第二个值,哪一个小就接着放入到上面新链表中
* 依次类推.执行结束
*/
function mergeTwoLists($l1, $l2) {
// print_r($l1->next);die();
// $l1->next返回的格式是
// ListNode Object
// (
// [val] => 2
// [next] => ListNode Object
// (
// [val] => 4
// [next] =>
// )
// )
$listNode = null;
$cur = null;
// 首先判断是否存在,这里是或关系
// 因为有可能这两个链表中其中一个已经全部排序完毕了,为空了,只需要把另一个追加进去就好了,所以为或关系
while($l1 || $l2) {
// 假设l2是空时,那就只去求l1->val和l1->next等,跟l2没关系了
if($l2 == null) {
// 判断$cur的目的是判断是否为第一次,如果第一次,直接放到一个链表就行,不用去next
if(!$cur) {
$cur = new ListNode($l1->val);
$listNode = $cur;
} else {
// 说明不是第一次了,之前已经有新的链表了,直接放入值就可以,next对应的就是链表中下一个值和下一个值的next数据,val就是链表中对应的第一个值
$cur->next = new ListNode($l1->val);
$cur = $cur->next;
}
// 设置l1等于l1链表中的下一个值和下一个值的next数据
$l1 = $l1->next;
// 下面的都类似于上面的逻辑
} else if ($l1 == null) {
if(!$cur) {
$cur = new ListNode($l2->val);
$listNode = $cur;
} else {
$cur->next = new ListNode($l2->val);
$cur = $cur->next;
}
$l2 = $l2->next;
} else if($l1->val < $l2->val) {
if(!$cur) {
$cur = new ListNode($l1->val);
$listNode = $cur;
} else {
$cur->next = new ListNode($l1->val);
$cur = $cur->next;
}
$l1 = $l1->next;
} else if ($l1->val >= $l2->val) {
if(!$cur) {
$cur = new ListNode($l2->val);
$listNode = $cur;
} else {
$cur->next = new ListNode($l2->val);
$cur = $cur->next;
}
$l2 = $l2->next;
}
}
return $listNode;
}
}
题解2
/**
* Definition for a singly-linked list.
* class ListNode {
* public $val = 0;
* public $next = null;
* function __construct($val) { $this->val = $val; }
* }
*/
class Solution {
/**
* @param ListNode $l1
* @param ListNode $l2
* @return ListNode
* 递归
*/
function mergeTwoLists($l1, $l2) {
if($l1 == NULL) {
return $l2;
}
if($l2 == NULL) {
return $l1;
}
$listNode = NULL;
if($l1->val < $l2->val) {
// $l1的链表赋值到变量listNode
$listNode = $l1;
$listNode->next = $this->mergeTwoLists($l1->next, $l2);
}else{
$listNode = $l2;
$listNode->next = $this->mergeTwoLists($l1, $l2->next);
}
return $listNode;
}
}