合并两个排序的链表

合并两个排序的链表
题目:

输入两个递增排序的链表, 合并这两个链表并使新链表中的节点仍然是递增排序的.

示例:
输入: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;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值