zoukankan      html  css  js  c++  java
  • 合并两个有序链表(Python and C++解法)

    题目:

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

    示例:

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

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/merge-two-sorted-lists

    思路:

    1. 使用迭代遍历的方法,轮流往后遍历俩链表;
    2. 设定一个哨兵节点 "prehead",没有哨兵节点时,添加一个节点要先判断是否是第一个节点,并需要单独保留第一个节点的指针,以便于返回整个链表的头指针,有哨兵节点时,链表头是固定的,不可能为空,后续的节点都是链接在前一个节点的,不需要单独判断是否为头节点;
    3. 时间复杂度是O(m+n),过程中没有产生新的链表,只是改变指针指向的关系,所以空间复杂度O(1)

    Python解法:

     1 class ListNode:  # 定义单链表
     2     def __init__(self, x):
     3         self.val = x
     4         self.next = None
     5 
     6 class Solution:
     7     @staticmethod
     8     def merge_two_lists(l1: ListNode, l2: ListNode) -> ListNode:
     9         if l1 is None:
    10             return l2
    11         if l2 is None:
    12             return l1
    13         pre_head = ListNode(0)  # 定义一个哨兵节点,其位置固定便于返回结果
    14         prev = pre_head
    15         while l1 and l2:
    16             if l1.val < l2.val:
    17                 prev.next = l1  # 指向较小的节点
    18                 l1 = l1.next  # 读取下一节点
    19             else:
    20                 prev.next = l2  # 指向较小的节点
    21                 l2 = l2.next  # 读取下一节点
    22             prev = prev.next  # 移动至下一节点
    23 
    24         if l1 is None:
    25             prev.next = l2
    26         if l2 is None:
    27             prev.next = l1
    28         return pre_head.next

    C++解法:

     1 struct ListNode {
     2     int val;
     3     ListNode *next;
     4     ListNode(int x) : val(x), next(NULL) {}
     5 };
     6 
     7 class Solution {
     8 public:
     9     ListNode *mergeTwoLists(ListNode *l1, ListNode *l2) {
    10         if (l1 == NULL)
    11             return l2;
    12         if (l2 == NULL)
    13             return l1;
    14         ListNode *preHead = new ListNode(0);  // 需要用new建立一个哨兵节点
    15         ListNode *prev = preHead;
    16         while (l1 != NULL && l2 != NULL) {
    17             if (l1->val < l2->val) {
    18                 prev->next = l1;
    19                 l1 = l1->next;
    20             }
    21             else {
    22                 prev->next = l2;
    23                 l2 = l2->next;
    24             }
    25             prev = prev->next;
    26         }
    27         if (l1 == NULL)
    28             prev->next = l2;
    29         if (l2 == NULL)
    30             prev->next = l1;
    31         return    preHead->next;
    32     }
    33 };
  • 相关阅读:
    类的组合
    类的继承和派生
    面向对象编程
    正则表达式
    sys模块 logging模块 序列化模块
    time 模块,random模块,os模块
    递归函数
    interface有没有继承Object
    UTF-8和GBK的区别
    九皇后
  • 原文地址:https://www.cnblogs.com/kongzimengzixiaozhuzi/p/13041746.html
Copyright © 2011-2022 走看看