剑指 Offer 25. 合并两个排序的链表

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

示例1:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4

限制:
0 <= 链表长度 <= 1000

这个合并链表的思路其实不难,就是遍历两个链表,只有两个都为空的时候才遍历完成,每次都比较l1和l2当前节点的大小,小的那个就直接存入新链表就行,直到遍历完成,返回新链表
思路就是那样,关键是看你怎么去写,刚开始想了很多以为很难写,其实写起来不是那么难,因为链表的遍历是你可以控制的,如果是for循环,每次都得强制向前走一步
需要注意的是,你怎么遍历链表,怎么往新链表中插入节点
还有遍历到其中一个链表为空之后,只需要再遍历完另外一个链表即可
还有刚开始有一个初始头节点,并把初始头节点赋值给pre了,如果直接用cur初始头节点遍历,那么最后cur存储的就是新链表的最后一个节点了,是为了保持它是头节点,最后返回cur->next就行了
这样的思路时间复杂度是O(m+n)
贴出代码:

class Solution {

    /**
     * @param ListNode $l1
     * @param ListNode $l2
     * @return ListNode
     */
    function mergeTwoLists($l1, $l2) {
        //l1为空,合并就直接返回l2就行
        if ($l1 == null) {
            return $l2;
        }
        if ($l2 == null) {
            return $l1;
        }
        $cur = new ListNode();
        $pre = $cur;
        while ($l1 != null || $l2 != null) {
            //当l1为空之后,只遍历l2就行了
            if ($l1 == null) {
                $pre->next = $l2;
                $pre = $l2;
                $l2 = $l2->next;
                continue;
            }
            //当l2为空之后,只遍历l1就行了
            if ($l2 == null) {
                $pre->next = $l1;
                $pre = $l1;
                $l1 = $l1->next;
                continue;
            }
            if ($l1->val < $l2->val) {
                $pre->next = $l1;//将l1指针放进新链表里面
                $pre = $l1;//将pre变为新链表最后一个节点
                $l1 = $l1->next;//用来遍历l1链表
            } else {
                $pre->next = $l2;
                $pre = $l2;
                $l2 = $l2->next;
            }
        }
        return $cur->next;
    }
}

你可能感兴趣的:(数据结构的实现,面试)