两个list关联合并_【每日Leetcode】No.21 合并两个有序链表

题目:合并两个有序链表

将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。实例输入:1->2->4, 1->3->4输出:1->1->2->3->4->4

题解

思路一

直接求解。创建一个新的哨兵节点,采用双指针操作对该链表对两个链表中的元素进行遍历。当其中一个链表遍历完毕后,将结果链表的下一跳链接至未完成遍历的链表的后续部分即可。

def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:        if l1 == None and l2 != None: return l2        if l2 == None and l1 != None: return l1        if l1 == None and l2 == None: return None        new_node = head = ListNode(None)        while True:            if l1.val < l2.val:                new_node.next = ListNode(l1.val)                new_node = new_node.next                l1 = l1.next            elif l1.val > l2.val:                new_node.next = ListNode(l2.val)                new_node = new_node.next                l2 = l2.next            elif l1.val == l2.val:                new_node.next = ListNode(l1.val)                new_node.next.next = ListNode(l2.val)                new_node = new_node.next.next                l1 = l1.next                l2 = l2.next            if l1 == None and l2 != None:                # print("进入1")                new_node.next = l2                break            elif l1 != None and l2 == None:                # print("进入2")                new_node.next = l1                break            elif l1 == None and l2 == None:                # print("进入3")                break        return head.next

执行结果

7eb3fd5a7db1c3b4ade8d5977305a7be.png

思路二

由于给定的链表是一个单向链表,题目中仅要求有序,因此只需要将两张列表中的值获得并排序后直接创造节点即可。

def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:        r_list = []        while l1 and l2:            if l1.val < l2.val:                r_list.append(l1.val)                l1 = l1.next            else:                r_list.append(l2.val)                l2 = l2.next        for rest_l in [l1, l2]:            while rest_l:                r_list.append(rest_l.val)                rest_l = rest_l.next        if r_list:            r_list_node = ListNode(x=r_list[0])            temp_node = r_list_node            for ind in range(1, len(r_list)):                num = r_list[ind]                temp_node.next = ListNode(x=num)                temp_node = temp_node.next            return r_list_node        else:            return None

执行结果

0c17447e5f1a1a12169538ee62820dc7.png

思路三

遍历比较后直接连接链表,一次遍历即可得出结果。如下图:

7bf63d541208a5304c0faf7a3c66cdbd.png

3d3c528832ea93bcf13eebcdcd4520c1.png

(图来自LeetCode官方)

def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:        dummyHead = ListNode(-1)        p = dummyHead        while True:            if l1 is None:                p.next = l2                return dummyHead.next            if l2 is None:                p.next = l1                return dummyHead.next            if l1.val <= l2.val:                p.next = l1                l1 = l1.next            else:                p.next = l2                l2 = l2.next            p = p.next

执行结果

4fa2f95fcedc52b9cebd1b60eba64642.png

45f950e5530e09a6b4373823b4bebd3e.png

终于等到你,请关注我吧~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值