LeetCode(21. 合并两个有序链表)

问题描述

将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

示例:

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

解决方案

# encoding: utf-8

class Node(object):
    def __init__(self):
        self.val = None
        self.next = None

    def __str__(self):
        return str(self.val)

def mergeTwoLists(l1, l2):
    # 处理边界情况(l1或l2为空)
    if l1 is None:
        return l2
    if l2 is None:
        return l1
    # 确保l1有最小的初始值
    if l2.val < l1.val:
        l1, l2 = l2, l1
    # 保存一个链表头用来作为返回值
    head = l1
    # 开始迭代到l1为最后一个节点
    while l1.next is not None:
        # 假如l2完结,工作完成
        if l2 is None:
            return head
        # 假如l2节点属于在l1的当前节点与下一个节点值之间
        if l1.val <= l2.val <= l1.next.val:
            # 在这一步我们通过设置l1.next\l2.next来拼接l2,并将L2 迭代
            l1.next, l2.next, l2 = l2, l1.next, l2.next
        # l1迭代向前
        l1 = l1.next
    # 以防l2较长的情况,我们在l1迭代完成后把l2加入到l1尾部
    l1.next = l2
    return head

测试代码

if __name__ == '__main__':

    three = Node()
    three.val = 3

    two = Node()
    two.val = 2
    two.next = three

    one = Node()
    one.val = 1
    one.next = two

    head = Node()
    head.val = 0
    head.next = one

    three1 = Node()
    three1.val = 3

    two1 = Node()
    two1.val = 2
    two1.next = three1

    one1 = Node()
    one1.val = 1
    one1.next = two1

    head1 = Node()
    head1.val = 0
    head1.next = one1
    newhead = mergeTwoLists(head, head1)
    while newhead:
        print(newhead.val, )
        newhead = newhead.next

原文地址:https://www.cnblogs.com/huang-yc/p/10612088.html

时间: 2024-10-08 23:39:35

LeetCode(21. 合并两个有序链表)的相关文章

LeetCode 21. 合并两个有序链表(Merge Two Sorted Lists)

21. 合并两个有序链表 21. Merge Two Sorted Lists 题目描述 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. LeetCode21. Merge Two Sorted Lists 示例: 输入: 1->2->4, 1->3->4 输出: 1->1->2->3->4->4 Java 实现 ListNode 类 class ListNode { int val; ListNode n

[leetcode] 21. 合并两个有序链表

21. 合并两个有序链表 两个有序链表合并为一个新的有序链表 class Solution { public ListNode mergeTwoLists(ListNode l1, ListNode l2) { ListNode ans = new ListNode(Integer.MAX_VALUE); ListNode p = ans; while (l1 != null && l2 != null) { if (l1.val < l2.val) { p.next = l1; l

LeetCode 21. 合并两个有序链表(C#实现)——链表,递归,迭代

迭代:设定哨兵节点head,维护一个prev指针,每次迭代都是调整prev的next指针,判断两个链表头元素大小,将小的值接入prev节点后面,同时将接入的链表和prev后 原文地址:https://www.cnblogs.com/jhgfdm/p/12274290.html

leetcode——21. 合并两个有序链表

我还是自己没有完成. 先建立新节点,然后进行操作. # Definition for singly-linked list. # class ListNode: # def __init__(self, x): # self.val = x # self.next = None class Solution: def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode: p=rst=ListNode(0) while True:

【leetcode】21. 合并两个有序链表

描述 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 思路 别用递归,递归会慢. 其他没啥了,挺简单的. class Solution: def mergeTwoLists(self, l1, l2): """ :type l1: ListNode :type l2: ListNode :rtype: ListNode """ head = ListNode(0) first = head while

21. 合并两个有序链表

知乎ID: 码蹄疾 码蹄疾,毕业于哈尔滨工业大学. 小米广告第三代广告引擎的设计者.开发者: 负责小米应用商店.日历.开屏广告业务线研发:主导小米广告引擎多个模块重构: 关注推荐.搜索.广告领域相关知识; 题目 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4输出:1->1->2->3->4->4 分析 有序链表合并,每次都取两个中较小的一个,直到其中一个遍历到

【Leetcode】合并两个有序链表

题目描述: 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4 题解链接 /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NUL

21. 合并两个有序链表-LeetCode

心得:链表问题加头指针,头指针要加一个引用(两个引用:一个用来遍历,另一个输出头节点,注意head.next) 输出完要将后面没有添加上的节点添加上. /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Solution { public ListNode mergeTwo

LeetCode:合并两个有序链表

C++示例: /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { ListNode* result = new L