合并两个有序链表(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 };
posted @ 2020-06-04 10:45  孔子?孟子?小柱子!  阅读(377)  评论(0编辑  收藏  举报