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

  • 题目描述

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

示例1:

输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
限制:

0 <= 链表长度 <= 1000

  • 分析

简单粗暴,参考题解:https://leetcode-cn.com/problems/he-bing-liang-ge-pai-xu-de-lian-biao-lcof/solution/mian-shi-ti-25-he-bing-liang-ge-pai-xu-de-lian-b-2/

首先这里需要初始化一个伪结点Dum指向NewList

然后循环合并:当l1或l2为空则跳出while循环

1.当l1.val<l2.val时,此时NewList的后继节点指向为l1,l1往后遍历

2.当l1.val>=l2.val时,此时NewList的后继节点指向为l2,l2往后遍历

3.NewList前进,NewList = NewList.next

合并剩余的尾部节点。

返回值:此时返回的是伪结点之后的链表

(为什么不需要比较每次NewList指向的后面的节点和Dum中的节点的大小,是因为在比较l1.val和l2.val的时候,每次只是移了小的那个val所在的链表)

代码:

class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None

class Solution:
    def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
        NewList = Dum = ListNode(0) #Dum是伪结点
        while l1 and l2:
            if l1.val < l2.val:
                NewList.next, l1 = l1, l1.next
            else:
                NewList.next, l2 = l2, l2.next
            NewList = NewList.next
        NewList.next = l1 if l1 else l2
        return Dum.next

a = ListNode(1)
a.next = ListNode(2)
a.next.next = ListNode(5)
b = ListNode(1)
b.next = ListNode(3)
b.next.next = ListNode(4)
s = Solution()
r = s.mergeTwoLists(a,b)

 

 当 l_1l 1​  或 l_2l 2​  为空时跳出;当 l_1.val < l_2.vall 1​ .val<l 2​ .val 时: curcur 的后继节点指定为 l_1l 1​  ,并 l_1l 1​  向前走一步;当 l_1.val \geq l_2.vall 1​ .val≥l 2​ .val 时: curcur 的后继节点指定为 l_2l 2​  ,并 l_2l 2​  向前走一步 ;节点 curcur 向前走一步,即 cur = cur.nextcur=cur.next 。
作者:jyd链接:https://leetcode-cn.com/problems/he-bing-liang-ge-pai-xu-de-lian-biao-lcof/solution/mian-shi-ti-25-he-bing-liang-ge-pai-xu-de-lian-b-2/来源:力扣(LeetCode)著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

posted @ 2020-08-04 22:28  Yelush  阅读(120)  评论(0)    收藏  举报